與直接使用 SQLite API 相比,Room 永久性程式庫具備許多優點:
- SQL 查詢的編譯時間驗證
- 透過便利的註解,盡量減少樣板程式碼重複且容易出錯的情況
- 簡化的資料庫遷移路徑
如果您的應用程式並非使用 SQLite 的 Room 實作項目,請參閱本頁的說明,瞭解如何遷移至 Room。如果 Room 是您在應用程式中使用的第一個 SQLite 實作項目,請參閱「使用 Room 將資料儲存在本機資料庫」一文,瞭解基本用法。
遷移步驟
如要將 SQLite 實作項目遷移至 Room,請執行下列步驟。如果您的 SQLite 實作項目使用大型資料庫或複雜的查詢,建議您逐步遷移至 Room。如要進一步瞭解逐步遷移策略,請參閱「逐步遷移作業」一節的相關說明。
更新依附元件
如要在應用程式中使用 Room,您必須在應用程式的 build.gradle 檔案中加入適用的依附元件。如要進一步瞭解 Room 依附元件,請參閱「設定」。
將模型類別更新為資料實體
Room 會使用資料實體來代表資料庫中的資料表。每個實體類別代表一個資料表,並提供代表該資料表內所有資料欄的屬性。請按照下列步驟,將現有模型類別更新為 Room 實體:
- 使用
@Entity為類別宣告加上註解,以表示此為 Room 實體。您可以視需要使用tableName屬性來表示產生的資料表應使用與類別不同的名稱。 - 使用
@PrimaryKey為主鍵屬性加上註解。 - 如果產生的資料表中有任何資料欄的名稱應與對應屬性的名稱不同,請使用
@ColumnInfo為屬性加上註解,並將name屬性設為正確的資料欄名稱。 - 如果類別含有您不想保留在資料庫中的屬性,請使用
@Ignore為這些屬性加上註解,以表示 Room 不應在對應資料表中為這些屬性建立資料欄。 - 如果類別有多個建構函式,請使用
@Ignore將所有其他建構函式加上註解,指出 Room 應使用哪一個建構函式。
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val id: String, @ColumnInfo(name = "username") val userName: String?, @ColumnInfo(name = "last_update") val date: Date?, )
建立 DAO
Room 會使用資料存取物件 (DAO) 定義存取資料庫的函式。請按照「使用 Room DAO 存取資料」一文中的操作說明,將現有查詢函式替換成 DAO。
建立資料庫類別
Room 的實作項目是使用資料庫類別來管理資料庫的執行個體。您的資料庫類別應擴充 RoomDatabase,並參照您所定義的所有實體和 DAO。
@Database(entities = [User::class], version = 2) @ColumnTypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
定義遷移路徑
由於資料庫版本編號有異動,您必須定義 Migration 物件來保留現有資料庫資料。如果資料庫結構定義沒有變更,這項遷移作業可以是空白的。
val MIGRATION_1_2 = object : Migration(1, 2) { override suspend fun migrate(connection: SQLiteConnection) { // Empty implementation, because the schema isn't changing. } }
如要進一步瞭解 Room 中的資料庫遷移路徑,請參閱「遷移資料庫」一文。
更新資料庫的例項建立作業
定義資料庫類別和遷移路徑後,您可以使用 Room.databaseBuilder 建立套用遷移路徑的資料庫執行個體:
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name") .addMigrations(MIGRATION_1_2) .build()
測試實作成果
請務必測試新的 Room 實作成果:
逐步遷移作業
如果應用程式使用大型複雜的資料庫,可能無法一次將應用程式全部遷移至 Room。不過,您可以第一步先選擇實作資料實體和 Room 資料庫,稍後再將查詢函式遷移至 DAO。
如要實作漸進式遷移,請使用 androidx.room3:room3-sqlite-wrapper 構件中的 roomDatabase.getSupportWrapper 擴充功能函式,取得 SupportSQLiteDatabase 相容性包裝函式。這個包裝函式可讓您使用 Android SQLite API,對 Room 管理的資料庫執行 Android 樣式的直接 SQL 查詢:
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")