iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

應用程式會把經常需要使用的資料儲存在本地端可以很好的改善使用者的體驗,這樣子使用者在網路不好時一樣可以瀏覽內容,並且當網路可以使用時就可以更新資料,過去我們使用 SQLite 來滿足 Android 開發中儲存本地端資料的需求,但它會有一些缺點,像是沒有在編譯時對 SQL 語法的檢查,所以資料庫發生變化時,就需要手動更新相關程式,非常耗時且容易出錯。

Room

針對 SQLite 的缺點,Google 提供了 Room 來解決這些問題,Room 基於 SQLite 上提供了一個抽象層,提供快速、簡潔的 Database 操作,讓資料庫可以順暢存取,同時發揮 SQLite 原有的效用,官方也強烈推薦用 Room 來取代 SQLite。
Room 主要分為三個部分:

  • Database
    用於保存資料庫以及應用程式資料的主要存取點。
  • Entity
    表示資料庫中的資料表。
  • DAO
    提供應用程式可以用於查詢、更新、插入、刪除資料庫中的方法。

https://ithelp.ithome.com.tw/upload/images/20220919/20151953fGojhQM80f.png

如何使用 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")
}
  • Entity
    定義一個 User 資料實體。
@Entity
data class User(
    @PrimaryKey val uid: Int,
    @ColumnInfo(name = "first_name") val firstName: String?,
    @ColumnInfo(name = "last_name") val lastName: String?
)
  • DAO
    新增DAO,DAO 就如我們上面說的提供了各種跟 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
    需要使用 @Database 來備註類別,其中會包含 entites 陣列,列出與資料庫關聯的所有 Entity,且類別必須繼承 RoomDatabase
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
  • 使用方法
    當我們定義完 Room 的三個部分之後,就可以這樣來建立資料庫實體。
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


上一篇
第十二天:Android Architecture Components 之 ViewModel
下一篇
第十四天:Android Architecture Components 之 WorkManager
系列文
轉職成 Android Developer 的最後一哩路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言