簡體   English   中英

無數據丟失的房間數據庫架構更新

[英]Room Database schema update without data loss

我使用 Kotlin 在 Android 中開發了一個應用程序,它可以在 playstore 上找到。 我已經使用 Room 數據庫來存儲這些值。 我有以下查詢:

  1. 數據庫架構現在已更改,我需要如何處理。 我參考了下面的教程,但仍不清楚如何處理遷移中的架構更改。 訪問https://developer.android.com/training/data-storage/room/migrating-db-versions.html

  2. 如何使用 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,您可以執行以下操作:

  1. 從playstore下載並安裝apk文件在移動設備中。

  2. 建立你的apk文件(簽名apk)。 在生成apk文件之前,不要忘記增加版本代碼。

  3. 按照以下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 = ""  
)

請參閱下面的參考

android開發者:房間版本2.4.0

安卓開發者:自動遷移

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM