آموزش پیاده سازی دیتابیس Room در اندروید
دیتابیس Room یکی از دیتابیس های قدرتمند اندروید هستش که تقریبا بیشتر از 90درصد برنامه نویس ها ازش استفاده میکنن.
Room در عین حال که قدرتمنده، بسیار ساده هم هستش.
برای ذخیره کردن اطلاعات روش های مختلفی وجود داره. ذخیره کردن در رَم، فایل، دیتابیس یا …
دیتابیس هم یکی از روش های ذخیره کردن اطلاعات هستش.
زمانی که شما اطلاعات رو در دیتابیس ذخیره کنید دیگه نگران از دست رفتن اونا هنگام خاموش و روشن شدن موبایل و یا بسته شدن اپلیکیشن نیستید.
انواع دیتابیس های اندروید
اندروید دیتابیس های مختلفی از جمله : SQLite – Room – Realm – GreenDao و … هستش.
توی این پست میخوام نحوه استفاده کردن از دیتابیس Room رو به طور کامل آموزش بدم.
قبلا یک پستی هم در سایت با عنوان بهترین دیتابیس در اندروید چیه ؟ قرار دادم و دیتابیس های مختلف اندروید رو از نظر سرعت به طور کامل بررسی کردم.
نحوه کارکرد دیتابیس Room
این دیتابیس درواقع یک لایه انتزاعی از SQLite هستش، ولی با کلی بهبودها که واقعا کار با دیتابیس رو خیلی راحتتر کرده.
Room به طور کلی به 3 تا فایل نیاز داره :
- Entity
- Dao
- Database
Room توسط هرکدوم از این 3 تا فایل عملیات دلخواه ما رو روی دیتابیس انجام میده.
Entity : وظیفه هندل کردن مدل ها رو برعهده داره.
Dao : دستورات دیتابیس یا Query ها رو اینجا مینویسیم که مخفف کلمه Data Access Objects هستش.
Database : داخل این کلاس هم دیتابیس Room رو معرفی میکنیم.
در تصویر بالا یک نمای کلی از عملکرد Room رو ملاحظه میکنید.
اضافه کردن دیتابیس Room
برای اینکه بتونی از این دیتابیس توی پروژه های خودت استفاده کنی باید dependencyهای زیر رو در گردل پروژه خودت اضافه کنی.
implementation("androidx.room:room-runtime:2.4.2") annotationProcessor("androidx.room:room-compiler:2.4.2") kapt("androidx.room:room-compiler:2.4.2")
همچنین چون از kapt استفاده میکنیم، باید پلاگین موردنظرش رو هم به گردل اضافه کنیم.
plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' }
کلاس Entity
همانطور که بالاتر توضیح دادم کلاس Entity اولین چیزی هستش که باید در زمان استفاده از Room تعرفیش کنیم.
توی این کلاس باید اطلاعاتی که قصد داریم توی دیتابیس ذخیره بشن رو در قالب مدل (model) تعریف کنیم.
برای اینکه ادامه روند آموزشی قابل درک باشه، میخوام یک مثال بزنم و با اون مثال آموزش رو ادامه بدیم.
برای مثال میخوایم اطلاعات کاربر که شامل آیدی – نام و سن هستش رو ذخیره کنیم.
برای اینکار نیاز به 3 تا متغیر، از نوع Int و String داریم که در کلاس Entity به صورت مدل باید تعریف کنیم.
به نمونه کد زیر توجه کن :
@Entity(tableName = "user_table") data class UserEntity( @PrimaryKey(autoGenerate = true) val userId: Int, val userName: String, val userAge: Int )
برای ساختن کلاس Entity اول از همه اون کلاس رو باید از نوع data انتخاب کنیم.
قبل از اسم کلاس باید از annotation (حاشیه نویسی) مخصوص Entity استفاده کنیم که Room متوجه بشه که این کلاس در واقع همون کلاس Entity هستش که نیاز داره.
بعد از تعریف مدل ها دیگه با این کلاس کاری نداریم.
فایل Dao
این فایل رو به صورت interface میسازیم و وظیفه مدیریت کردن دستورات دیتابیسی (Query) رو برعهده داره.
دستوراتی مثل : ذخیره، خواندن، بروزرسانی و حذف کردن اطلاعات از دیتابیس در این فایل نوشته میشن.
Room برخلاف SQLite دستورات مهم دیتابیس رو خودش پیاده سازی کرده و دیگه نیاز نیستش که خودمون بخوایم براشون دستی Query بنویسیم.
برای مثال من میخوام 4 عمل اصلی که بالاتر بهشون اشاره کردم رو در این فایل ازشون استفاده کنم.
به نمونه کد زیر توجه کن :
@Dao interface UserDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertUser(user: UserEntity) @Update fun updateUser(user: UserEntity) @Delete fun deleteUser(user: UserEntity) @Query("SELECT * FROM user_table") fun getAllUser(): MutableList<UserEntity> }
برای اینکه Room متوجه بشه که این فایل همون فایل Dao هستش که میخواد، مانند حالت قبلی از annotation مخصوص اینکار یعنی Dao قبل این فایل استفاده میکنیم.
همونطور که بالاتر بهش اشاره کردم Room دستورات مهم کار با دیتابیس رو به صورت پیشفرض خودش پیاده سازی کرده و ما فقط باید ازشون استفاده کنیم.
این دستورات در واقع همون Insert – Update – Delete هستش که در کد بالا به صورت annotation ازشون استفاده کردم.
برای خوندن تمامی اطلاعات از دیتابیس من یک Query نوشتم که به واسطه اون میتونم تمامی اطلاعات از دیتابیس رو بخونم و در قالب لیست برگردونم.
مثلا میخوایم کل کاربران رو به صورت لیست دریافت کنیم و داخل RecyclerView نمایش بدیم.
کلاس Database
این کلاس هم وظیفه مدیریت کردن کلی دیتابیس رو برعهده داره.
درواقع 2 فایل قبلی که تعریف کردیم رو بهم دیگه متصل میکنه که بتونیم ازشون استفاده کنیم.
به کد زیر توجه کن :
@Database(entities = [UserEntity::class], version = 1) abstract class UserDatabase : RoomDatabase() { abstract fun dao(): UserDao }
در کد بالا Entity و Dao رو تعریف میکنیم و ورژن دیتابیس رو هم مشخص میکنیم.