【发布时间】:2018-07-02 03:54:13
【问题描述】:
假设,我有一个简单的 Room 数据库:
@Database(entities = {User.class}, version = 1)
abstract class AppDatabase extends RoomDatabase {
public abstract Dao getDao();
}
现在,我要添加一个新实体:Pet,并将版本升级到 2:
@Database(entities = {User.class, Pet.class}, version = 2)
abstract class AppDatabase extends RoomDatabase {
public abstract Dao getDao();
}
当然,Room 会抛出异常:java.lang.IllegalStateException: A migration from 1 to 2 is necessary.
假设,我没有更改 User 类(所以所有数据都是安全的),我必须提供迁移,它只是创建一个新表。因此,我正在研究 Room 生成的类,搜索生成的查询以创建我的新表,将其复制并粘贴到迁移中:
final Migration MIGRATION_1_2 =
new Migration(1, 2) {
@Override
public void migrate(@NonNull final SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS `Pet` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))");
}
};
但是我发现手动操作很不方便。 有没有办法告诉 Room:我没有碰任何现有的表,所以数据是安全的。请为我创建迁移?
【问题讨论】:
-
您找到解决方案了吗?
-
我遇到了同样的问题,并以与您相同的方式修复了它,但也没有找到解决方案。很高兴那时我并不孤单。 :)
-
这里也一样。我发现 Room 能够在 database_impl 中生成创建查询,但是一旦迁移开始就不能只创建表,这很不方便......
-
我愿意为这样的功能付出这么多...混合迁移和回退机制也很好...
-
我不确定这是否会有所帮助,但 Room 确实可以选择将数据库模式导出到 JSON 文件中。 developer.android.com/training/data-storage/room/… 显然,这仍然意味着手动添加迁移脚本,但您不需要通过自动生成的类来获取 SQL 语句。
标签: java android database-migration android-room