سبد خرید

آموزش پیاده سازی دیتابیس Room در اندروید

آموزش پیاده سازی دیتابیس Room در اندروید

دیتابیس Room یکی از دیتابیس های قدرتمند اندروید هستش که تقریبا بیشتر از 90درصد برنامه نویس ها ازش استفاده میکنن.

Room در عین حال که قدرتمنده، بسیار ساده هم هستش.

برای ذخیره کردن اطلاعات روش های مختلفی وجود داره. ذخیره کردن در رَم، فایل، دیتابیس یا …

دیتا‌بیس هم یکی از روش های ذخیره کردن اطلاعات هستش.

زمانی که شما اطلاعات رو در دیتا‌بیس ذخیره کنید دیگه نگران از دست رفتن اونا هنگام خاموش و روشن شدن موبایل و یا بسته شدن اپلیکیشن نیستید.

انواع دیتابیس های اندروید

اندروید دیتا‌بیس های مختلفی از جمله : SQLiteRoom Realm GreenDao و … هستش.

توی این پست میخوام نحوه استفاده کردن از دیتا‌بیس Room رو به طور کامل آموزش بدم.

قبلا یک پستی هم در سایت با عنوان بهترین دیتابیس در اندروید چیه ؟ قرار دادم و دیتا‌بیس های مختلف اندروید رو از نظر سرعت به طور کامل بررسی کردم.

نحوه کارکرد دیتابیس Room

این دیتا‌بیس درواقع یک لایه انتزاعی از SQLite هستش، ولی با کلی بهبودها که واقعا کار با دیتا‌بیس رو خیلی راحتتر کرده.

Room به طور کلی به 3 تا فایل نیاز داره :

  1. Entity
  2. Dao
  3. Database

Room توسط هرکدوم از این 3 تا فایل عملیات دلخواه ما رو روی دیتابیس انجام میده.

Entity : وظیفه هندل کردن مدل ها رو برعهده داره.

Dao : دستورات دیتابیس یا Query ها رو اینجا مینویسیم که مخفف کلمه Data Access Objects هستش.

Database : داخل این کلاس هم دیتا‌بیس Room رو معرفی میکنیم.

room_database_android-دیتابیس 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 هستش که نیاز داره.

نکته
البته نام جدول (table) دیتابیس رو باید به عنوان tableName در Entity معرفی کنیم.

بعد از تعریف مدل ها دیگه با این کلاس کاری نداریم.

فایل Dao

این فایل رو به صورت interface میسازیم و وظیفه مدیریت کردن دستورات دیتابیسی (Query) رو برعهده داره.

دستوراتی مثل : ذخیره، خواندن، بروزرسانی و حذف کردن اطلاعات از دیتابیس در این فایل نوشته میشن.

Room برخلاف SQLite دستورات مهم دیتابیس رو خودش پیاده سازی کرده و دیگه نیاز نیستش که خودمون بخوایم براشون دستی Query بنویسیم.

البته Room به طور کامل از 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 نمایش بدیم.

نکته
چون ممکنه یکسری اطلاعات تکراری توسط کاربر وارد بشه، برای اینکه دیتابیس با مشکل و کرش روبرو نشه برای همین داخل insert از کد onConflict هم استفاده کردم.

کلاس Database

این کلاس هم وظیفه مدیریت کردن کلی دیتابیس رو برعهده داره.

درواقع 2 فایل قبلی که تعریف کردیم رو بهم دیگه متصل میکنه که بتونیم ازشون استفاده کنیم.

به کد زیر توجه کن :

@Database(entities = [UserEntity::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
    abstract fun dao(): UserDao
}

در کد بالا Entity و Dao رو تعریف میکنیم و ورژن دیتابیس رو هم مشخص میکنیم.

نکته
هرموقع تغییری در فایل Entity بوجود آوردی، حتما باید نسخه دیتابیس رو ارتقا بدی.
دیدگاه‌ها ۰