KC Blog

掌握 Android 持久化存儲:Kotlin 與 Room 資料庫實戰教學

5 min read
AndroidDev#Android#Kotlin

前言

1.根據需求導入要用的Room library

2.Room 主體為以下三種:Entity、DAO、Database

3.為防止查詢封鎖 UI,Room 不允許在主執行緒上存取資料庫

實作

1.建立Entity

透過Room的@Entity標籤可以幫你建立db的table

@PrimaryKey幫你建立了每組資料唯一的Primary key

命名table 欄位 可以直接用變數 如 :id

也可以使用 @ColumnInfo(name = "name") 指定欄位名稱

2.建立DAO

透過Room的@Dao標籤可以幫你建立操作db資料的方式

@Insert :可以讓你插入到table內

@Query :可以讓你自定義SQL執行

一些常用的SQL可參考官方文件

@Delete :刪除資料

@Insert(onConflict = OnConflictStrategy.REPLACE) :當遇到有衝突Primary key時 會Replace而不是忽略或不做事

@Update: 更新資料

3.建立Database

使用@Database來創建一個RoomDatabase

entities 是你要建立的資料表

version 是更新版本用

4.Build Database

直接用下面code 來獲得RoomDatabase 實例

5.實際操作Room

透過前面寫好的DAO直接操作

其他用法

非同步DAO用法
支援程度
1.Room 2.1 支援suspend function,並使用Coroutines

2.Room 2.2 支援Flow 3.其他也有支援RxJava、LiveData、Guava...等,有興趣可看:官方文件

Coroutines 操作Room用法
Flow、LiveData操作Room用法

完成上面操作介面後,照一般使用coroutines、flow、LiveData方式即可

想要預先建立資料庫內容.db檔
若想要針對資料庫內存有預設資料可將存放資料的.db預先埋入儲存路徑,再透過createFromAsset創建

或者想要用File建立,則改成.createFromFile(File("mypath"))即可

類型轉換器
當原生支援的的變數類型不夠用,剛好又想自訂時,

可用@TypeConverters

轉換變數型態,並讓它能在Room中使用。

假設需要在 Room 資料庫中保存 Date,Room 不知道如何保存 Date 物件,可以用:

創建TypeConverter
加入到DB
能在Room中使用了
Room程式碼上的一些使用技巧
1.可支援tableName用標籤形式定義 且 支援多重主鍵primaryKeys
2.建立Embedded物件,並讓data class 建立儲存欄位
3.定義資料表關聯
有兩張表

某些case下想要取得兩表對應的資料來做使用

加入 對應的父、子entity,以此例,分別是UserEntity、HistoryEntity。

再來加入@Relation 其中需要入對應的唯一鍵值,如primaryKey。

以此例來說parentColumn對應的是UserEntity的primaryKey

entityColumn對應的是HistoryEntity的primaryKey

最後再在DAO加入操作方法:

其中加入@Transaction,可以保證數據的一致性,

因有時候數據庫進行多個操作時,

如操作A表再次操作B表,

若中間A表成功取出,B表失敗,

這時返回的結果可能是錯的,

所以使用@Transaction 可以讓取得資料要就全部成功,不然就全部失敗,

不會讓操作段在一半,使得資料取出怪怪的。

4.針對資料庫做版本遷移
- 自動更新:@Database內的version,加入遷移版本:AutoMigration (from = 1, to = 2)會讓資料庫隨version自動版本遷移。 - 手動更新:透過 Migration 定義遷移的SQL指令 room 1 在build Room db時加入Migration,例如: