【问题标题】:Updating a DB file in Android using Room使用 Room 在 Android 中更新数据库文件
【发布时间】:2023-02-24 03:09:11
【问题描述】:

我有一个 android 应用程序,我使用 Room 来管理数据库操作。 我想更新我的数据库并添加一个包含新数据的新列,所以我首先使用 python 在应用程序外部创建了我的数据库,然后用数据填充了数据库。

之后,我只需将新的数据库复制并粘贴到我的应用程序中,然后覆盖旧的数据库文件。 当我运行应用程序时,出现错误:

A migration from 3 to 4 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) 

所以我创建了一个这样的迁移:

public class Migration_3_4 extends Migration {
    public Migration_3_4() {
        super(3, 4);
    }

    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE movies ADD COLUMN lang TEXT");
    }
}

并更新了数据库创建:

Room.databaseBuilder(context, AppDatabase.class, "movies.db")
        .addMigrations(new Migration_3_4())
        .build();

在那之后,我没有得到任何错误,但我在新列中得到了 'null' 值。 然后我再次复制粘贴新的数据库,但我仍然在新列中看到 null 值。

我怎样才能将更新的数据库传输到我的应用程序?

谢谢

【问题讨论】:

    标签: android database android-room


    【解决方案1】:

    如果您只是希望所有值都是相同的值,那么在 ALTER 之后您可以使用:-

    database.execSQL("UPDATE movies SET lang = 'whatever value you want';");
    

    可以更改以上内容以设置基于其他列的语言。

    或者,您可以通过 @ColumnInfo 注释告诉 Room 使用默认值,例如

    @ColumnInfo(default="whatever value you want")
    String lang;
    

    .请注意,您随后需要 ALTER 也具有 DEFAULT,否则 Room 将由于模式不匹配而崩溃,因此 ALTER 将变为:-

    database.execSQL("ALTER TABLE movies ADD COLUMN lang TEXT DEFAULT 'whatever value you want'");
    

    如果你想引入一个使用另一个 SQLite 工具创建或修改的数据库(新数据库),那么它会稍微复杂一些。但基本上你将外部修改的数据库放在资产文件夹中,然后从迁移中的资产文件夹中复制新数据库中的数据,或者可以使用createFromAsset(如果数据库文件不存在)。

    请注意,对于已发布的应用程序,您需要满足新用户和现有用户的需求,因此您可能需要混合使用迁移和createFromAsset

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多