
در این آموزش می خواهیم دیتابیس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وجود دارد.
- Database
- Dao
- 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در قسمت کامنت ها مطرح کنید تا به آنها پاسخ بدهم.
جدیدترین ویدئوهای آموزشی
در بخش TV باگتو، آموزش های کوتاه و جدید را مشاهده نمایید