以往我們在使用 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 框架的學習紀錄,照著查到的資料一步一步實作下來,感覺還蠻容易上手的。若之後有機會導入到專案中,會再補充其他使用心得。