迁移以将新数据行插入 Room DB

Mic*_*eyR 5 database migration android android-room

我正在制作一个新版本的应用程序,其新功能需要 Room DB 中的设置表中包含更多行数据。尽管我的数据库在结构上没有改变(没有新表,没有列更改等),但我正在考虑在 Room DB 上运行新的迁移(DB v2 -> v3),只是为了将这些新数据行添加到现有表中。这太过分了吗?

DB_INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            MyDatabase.class, Constants.DB_NAME)
                            .addMigrations(new Migration_1_2(context, 1, 2), new Migration_2_3(2, 3))
                            .build();
Run Code Online (Sandbox Code Playgroud)

我知道我可以在 RoomDatabase 的 onCreate() / onOpen() 回调中添加数据。例如

private static RoomDatabase.Callback rdc = new RoomDatabase.Callback() {
            public void onCreate (SupportSQLiteDatabase db) {
                // do something after database has been created
            }
            public void onOpen (SupportSQLiteDatabase db) {
                // do something every time database is open
            }
        };
Run Code Online (Sandbox Code Playgroud)

但我不确定这两个是否合适?

onCreate() - 对于现有应用程序用户,不会调用此方法,因为他们已经拥有上一个应用程序版本的数据库。

onOpen() - 每次启动应用程序时都会运行 - 这看起来开销很大。

至少对于新的迁移来说,这只会为用户运行一次。这是正确的方法吗?

Tan*_*jan 0

尝试这个来添加迁移。

在实体中添加列名称

 @ColumnInfo(name = "columnName")
 private String columnName;
Run Code Online (Sandbox Code Playgroud)

使用此代码块执行迁移查询

 static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
              database.execSQL("ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " " + type + " DEFAULT NULL");
        }
    };
Run Code Online (Sandbox Code Playgroud)

添加迁移

.addMigrations(MIGRATION_1_2,MIGRATION_2_3)
.build();
Run Code Online (Sandbox Code Playgroud)

然后增加你的数据库版本。