應用程式會把經常需要使用的資料儲存在本地端可以很好的改善使用者的體驗,這樣子使用者在網路不好時一樣可以瀏覽內容,並且當網路可以使用時就可以更新資料,過去我們使用 SQLite 來滿足 Android 開發中儲存本地端資料的需求,但它會有一些缺點,像是沒有在編譯時對 SQL 語法的檢查,所以資料庫發生變化時,就需要手動更新相關程式,非常耗時且容易出錯。
針對 SQLite 的缺點,Google 提供了 Room 來解決這些問題,Room 基於 SQLite 上提供了一個抽象層,提供快速、簡潔的 Database 操作,讓資料庫可以順暢存取,同時發揮 SQLite 原有的效用,官方也強烈推薦用 Room 來取代 SQLite。
Room 主要分為三個部分:
這次使用官方提供的範例來說明,首先要先在 build.gradle 加入 Room 的 dependencies。
dependencies {
val room_version = "2.4.3"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
kapt("androidx.room:room-compiler:$room_version")
}
User
資料實體。@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
User
資料表中的資料互動的方法。@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
@Database
來備註類別,其中會包含 entites
陣列,列出與資料庫關聯的所有 Entity,且類別必須繼承 RoomDatabase
。@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
然後透過我們建立的資料庫實體的方法來執行 DAO 所設定的互動方式來執行你想要對資料庫做的事情。
val userDao = db.userDao()
val users: List<User> = userDao.getAll()
Save data in a local database using Room | Android Developers