技術學習記錄

[Android]Room學習筆記

以往我們在使用 SQLite 的時候,常常需要建立 SQLiteOpenHelper 類別。

並透過 SQL 語法實作一系列 CRUD 方法來實現「新增、刪除、修改、查詢」的功能。

但這樣的方式太過繁瑣,為了解決這類痛點,出現了不少 ORM 框架。

Room 是 Android Jetpack 的成員之一,目的是用來實作 Java/Kotlin 和 SQLite 間的資料轉換層,也就是 ORM。

由於先前直接使用 Realm 來解決這些問題,因此沒有使用過其他的框架。

剛好由於公司部門縮減被裁,因此有多餘時間來學習新技術,因此就有了本篇學習紀錄。

使用 Room

建立元件

首先先在 app 模組的 build.gradle 中加入依賴,如下所示:接著實作 Entity、DAO、Database,如下所示:

dependencies {
    def room_version = "2.2.0-alpha02"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}

Entity 部分

Entity實際上就是資料在程式碼中的物件對應,Room會透過這個類別將資料轉換成物件,讓我們可以在Java/Kotlin上使用。程式碼如下:

@Entity
data class Student(
    @PrimaryKey(autoGenerate = true)
    var id: Int? = 0,
    var name: String = "",
    var birthday: Long = 0L,
    var studentGrade: Int = 0,
    var studentClass: Int = 0
)

DAO 部分

DAO這個介面主要是讓我們自己定義新刪改查功能,程式碼如下:

@Dao
interface StudentDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun add(item: Student): Long

    @Delete
    fun deleteData(item: Student)

    @Update
    fun update(item: Student)

    @Query("SELECT * FROM student WHERE name LIKE :name")
    fun findByName(name: String): Student

    @Query("SELECT * FROM student")
    fun getAll(): List<Student>
}

Database 部分

這個部分是資料庫真正的實體,這裡定義了資料庫的檔名、所包含的資料表、以及資料庫版本等參數。程式碼如下:

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

    companion object {
        @Volatile
        private var instance: MyDbHelper? = null
        private val LOCK = Any()

        operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
            instance ?: buildDatabase(context).also { instance = it }
        }

        private fun buildDatabase(context: Context) = Room.databaseBuilder(
            context,
            MyDbHelper::class.java, "students.db"
        ).allowMainThreadQueries().build()
    }

    abstract fun getRoomDao(): StudentDao
}

如何使用

1.實例化 Database 物件

db = MyDbHelper(this)

2.新增資料方式

val student = Student(
    id = null,
    name = "王小明",
    birthday = 1368633600000,
    studentGrade = 6,
    studentClass = 18
)

db.getRoomDao().add(student)

3.刪除資料方式

db.getRoomDao().delete(student)

4.修改資料方式

db.getRoomDao().update(student)

5.查詢資料方式

val studentList: List<Student> = db.getRoomDao().getAll()

以上是 Room 框架的學習紀錄,照著查到的資料一步一步實作下來,感覺還蠻容易上手的。若之後有機會導入到專案中,會再補充其他使用心得。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *