[英]Room Database schema update without data loss
我使用 Kotlin 在 Android 中開發了一個應用程序,它可以在 playstore 上找到。 我已經使用 Room 數據庫來存儲這些值。 我有以下查詢:
數據庫架構現在已更改,我需要如何處理。 我參考了下面的教程,但仍不清楚如何處理遷移中的架構更改。 訪問https://developer.android.com/training/data-storage/room/migrating-db-versions.html
如何使用 Playstore 版本測試我當前的應用程序?
我在這里先向您的幫助表示感謝。
這是一個非常復雜的問題,但基本上你有兩個策略:
fallbackToDestructiveMigration
- >易於實現,但一旦應用更新,您的用戶將丟失其數據 Migration
策略(首選) 案例1 - fallbackToDestructiveMigration
在數據庫初始化中,只需在數據庫構建器上調用fallbackToDestructiveMigration
:
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
在這種情況下,由於您已更新數據庫版本(假設從版本1到版本2),Room無法找到任何遷移策略,因此它將回退到破壞性遷移, 刪除表。
案例2 - 智能遷移
假設您有一個名為“Users”的表,並假設您在數據庫的第2版中向此表添加了一列。 讓我們將此列稱為“user_score”您應該實現Migration
類的migrate
接口,以便將“Users version 1”架構更新為“Users version 2”架構。 為此,您需要一個alter table
,您可以直接在migrate
方法中編寫它:
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
// Your migration strategy here
database.execSQL("ALTER TABLE Users ADD COLUMN user_score INTEGER")
}
};
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.addMigrations(MIGRATION_1_2)
.build();
更多參考資料:
對於您的問題2,您可以執行以下操作:
從playstore下載並安裝apk文件在移動設備中。
建立你的apk文件(簽名apk)。 在生成apk文件之前,不要忘記增加版本代碼。
按照以下adb
命令在設備中安裝已簽名的apk文件
adb install -r "apk_file_path"
希望這會奏效。
您應該使用VCS(如git)。 對於應用程序的每個版本,您應該創建一個標記,以便您可以輕松地在已發布的版本之間切換以測試兼容性。
遷移本身可以通過在遷移中調用房間數據庫上的原始查詢來完成。 如果你不知道如何編寫它們,你應該先閱讀一些關於SQL的教程。
從房間版本 2.4.0開始,您可以使用 autoMigrations 輕松更新。
數據庫類
@Database(
version = 3,
autoMigrations = [
AutoMigration(from = 1, to = 2),
AutoMigration(from = 2, to = 3)
],
.....
)
數據類
@Entity(tableName = "user")
data class DataUser(
....
// I added this column, like this
@ColumnInfo(defaultValue = "")var test: String = ""
)
請參閱下面的參考
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.