مقالات باگتو

آموزش دیتابیس Room در اندروید با زبان کاتلین
آموزش دیتابیس Room در اندروید با زبان کاتلین

در این آموزش می خواهیم  دیتابیسRoomرا توضیح دهیم. خب کمی در مورد دیتابیسroom صحبت کنیم.

سورس کد این آموزش را میتوانید از اینجا دانلود کنید.

 

Roomچیست؟

کتابخانهRoom یک لایهabstractionاست که رویSQLiteقرارگرفته.

دیتابیسRoomیکORM (Object Relational Mapper)برای پایگاه دادهSQLiteدر اندروید است. دیتابیسRoomبا پیاده سازی  annotationها استفاده ازSQLiteرا بسیار آسان کرده.

 

چرا باید از دیتابیسRoom استفاده کنیم؟

 

  • Compile Time Verification

در دیتابیسSQLiteاگرqueryخطایی داشته باشد باعث ایجادexceptionدر زمان اجرا می شود. اگر از دیتابیسRoomاستفاده کنیمqueryرا در زمان کامپایل بررسی می کند. بنابراین ما می توانیم ازexceptionهای زمان اجرا جلوگیری کنیم.

  • Boilerplate Code

برای تبدیل داده ها ازSQLiteبهDTO (Data Transfer Object)باید کدهای زیادی بنویسیم. داده هایی که به صورت داخلی توسطRoomمدیریت می شوند نیازی به نوشتن کد تبدیل ندارند.

  • به راحتی با دیگرComponentهای معماری ادغام میشود.

دیتابیسRoomجزئی ازAndroid Architectureاست. بنابراین می تواند داده ها را بصورتobservableمانندLiveDataیاRxJava فراهم کند.

 

3componentاصلی در دیتابیسRoomوجود دارد.

  1. Database
  2. Dao
  3. Entity

معماری دیتابیسRoom

 

 

 

Entity

  • جدول موجود در پایگاه داده را نشان می دهد. Roomبرای هر کلاس جدولی ایجاد می کند وباannotationهایentityنوشته میشوند فیلدهای کلاس ستون های جدول را مشخص میکنند. بنابراین  کلاسهایentityکلاسهایModelهای کوچکی هستند که هیچ منطقی ندارند.

 

  • برخی از  annotationهای مفید و ویژگی های آنها:

      __ Foreign keys: نام کلیدهای خارجی

      __ Indices: لیست نشانگرهای موجود در جدول

      __Primary keys :نام کلیدهای اصلیentity

      __table name: نام جدول

 

Primary Keyاینannotationکلید اصلیentityرا نشان می دهد.AutoGenerate- اگر رویtrueتنظیم شود ،sqliteیکunique idبرای ستون ایجاد می کند.

PrimaryKey(autoGenerate = true )

 

ColumnInfoامکان تعیین اطلاعات سفارشی در مورد ستون را فراهم می کند.

ColumnInfo(name = “column_name”)

 

Ignoreفیلد توسطRoomادامه نخواهد یافت.

 

Database

برای ایجاد یک دیتابیس درRoom باید یک کلاس ایجاد کنیم و آن را با یکannotation,databaseمشخص میکنم ( @Database).در ورودیannotationباید نام جدول ها و نسخه دیتابیس را وارد کنیم.

مثال     @Database(entities = [Note::class], version = 1)

 

Dao

برای دسترسی به محتوای دیتابیس باید شیusingرا با استفاده از یکinterfaceکه حاوی انوتیشنDaoاست را ایجاد کنیم. در داخل اینinterfaceما باید متد های مورد نیاز برای عملیاتdbرا ایجاد کنیم.

در اینجا می توانیم از 4 انوتیشن استفاده کنیم:

  • Query
  • Insert
  • Update
  • Delete

Qury: برای اجرایqueryخام ما باید از این انوتیشن استفاده کنیم.

Insert:با این انوتیشن میتوانید داده ها را در دیتابیس وارد کنید.

Update: با استفاده از این انوتیشن عملیات به روز رسانی روی داده های موجود در دیتابیس را انجام میدهید.

Delete: با این انوتیشن میتوانید داده ها را از روی دیتابیس پاک کنید.

 

چرا دیتابیسRoomاز طریق دیتابیسSQLite؟

  • در زمان کامپایلqueryهایSqlرا تایید میکنید بنابراین زمان اجرا با خطاهایsyntaxمواجه نمیشوید.
  • کد بسیار کمتری برای نوشتن.
  • پشتیبانی از اداغام با Architecture Component

 

حال دیتابیسRoomرا با یک مثال پیاده سازی میکنیم.

مرحله 1:یک پروژه جدید درAndroid Studioباempty activityایجاد کنید.

مرحله 2: وابستگی های زیر را اضافه کنید.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 28


    defaultConfig {
        applicationId "com.bugeto.todolist"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    def lifecycle_version = "2.1.0"
    def room_version = "2.2.3"

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'com.google.android.material:material:1.2.0-alpha03'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    // ViewModel and LiveData
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation 'io.reactivex.rxjava2:rxjava:2.2.16'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'


    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

 

مرحله 3:حالا بیایید یکEntityایجاد کنیم.

  • باید یک فیلد را به عنوان کلید اصلی اعلام کنید. این فیلد را با انوتیشنPrimaryKeyوautoGenerateمشخص بنویسید که مقدار پیش فرض آنfalseاست.
  • کلاس با انوتیشنEntityمشخص شده و مقدار آن هم نامی است که برای جدول انتخاب شده است.
package com.bugeto.todolist

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "note_table")
data class Note(val title: String,
                val description: String,
                val priority: Int,
                @PrimaryKey(autoGenerate = false) val id: Int? = null)

 

مرحله 4:با استفاده ازinterfaceیکDao(Data access object) ایجاد کنید.

  • این کلاس با انوتیشنDaoنوشته می شود.
  • برای انجام عملیاتCRUDچهار انوتیشنQuery،Insert،Update،Deleteوجود دارد.
package com.bugeto.todolist

import androidx.lifecycle.LiveData
import androidx.room.*

@Dao
interface NoteDao {

    @Insert
    fun insert(note: Note)

    @Update
    fun update(note: Note)

    @Delete
    fun delete(note: Note)

    @Query("delete from note_table")
    fun deleteAllNotes()

    @Query("select * from note_table order by priority desc")
    fun getAllNotes(): LiveData<List<Note>>
}
 

مرحله 5:یک کلاس دیتابیس ایجاد کنید.کلاسNoteDatabase  که ازRoomDatabaseمشتق میشود.

package com.bugeto.todolist

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.huawei.todolist.utils.subscribeOnBackground

@Database(entities = [Note::class], version = 1)
abstract class NoteDatabase : RoomDatabase() {

    abstract fun noteDao(): NoteDao

    companion object {
        private var instance: NoteDatabase? = null

        @Synchronized
        fun getInstance(ctx: Context): NoteDatabase {
            if(instance == null)
                instance = Room.databaseBuilder(ctx.applicationContext, NoteDatabase::class.java,
                    "note_database")
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallback)
                    .build()

            return instance!!

        }

        private val roomCallback = object : Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                populateDatabase(instance!!)
            }
        }

        private fun populateDatabase(db: NoteDatabase) {
            val noteDao = db.noteDao()
            subscribeOnBackground {
                noteDao.insert(Note("title 1", "desc 1", 1))
                noteDao.insert(Note("title 2", "desc 2", 2))
                noteDao.insert(Note("title 3", "desc 3", 3))

            }
        }
    }



}

مرحله 6:مدیریت داده ها

Query:


init {
    noteDao = database.noteDao()
    allNotes = noteDao.getAllNotes()
}

Insert:

fun insert(note: Note) {

    subscribeOnBackground {
        noteDao.insert(note)
    }
}

Update:

fun update(note: Note) {
    subscribeOnBackground {
        noteDao.update(note)
    }
}

Delete:

fun delete(note: Note) {
    subscribeOnBackground {
        noteDao.delete(note)
    }
}

 

این آموزش هم به پایان رسید امیدوارم که مفید واقع شده باشد.

 

سوالات و مشکلات خود را در مورد با دیتابیسroomدر قسمت کامنت ها مطرح کنید تا به آنها پاسخ بدهم.

 

 

 

 

تگ‌ها
اشتراک

0 نظرات

    ;