我向现有数据库添加了一些新的实体(表)。因此在数据库配置中进行了配置-
@Database(entities = {existingTable1.class, existingTable2.class, existingTable3.class, existingTable4.class,
newTable1.class, newTable2.class
}, version = 1, exportSchema = false)
从那时起,该应用程序处于开发阶段,我曾使用它来避免迁移。因此,我从设备上取消了该应用的安装,并通过Android Studio安装(运行)。但是它给出了以下错误-
房间无法验证数据完整性。看起来你变了 模式,但忘记更新版本号。您可以简单地解决 通过增加版本号。
在我的清单中,allowBackup设置为false,如下所示-
android:allowBackup="false"
已编辑
我有话要说。我在素材资源文件夹中有一个sqlite数据库文件。我只是将其复制到安装时对应的app DB文件夹中。因此,当需要添加包含大量预填充数据的新表时,我只需更新资产文件夹中的sqlite数据库文件,然后调整相关实体并构建/运行项目即可。这样,它工作正常,但是这次却产生了这个问题。
答案 0 :(得分:2)
如果您在 APK 中预先打包了数据库。然后从中删除“room_master_table”。 你可以SQLborwser。
答案 1 :(得分:0)
更改Room数据库结构时,应创建一种更新现有数据库的方法。如果第一个结构是版本1,则第二个结构应该是版本2。 但是Room需要一种将现有数据库更新为新结构的方法。 您应该创建一个迁移功能。
static RoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (RoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "your_database")
.addMigrations(MIGRATION_1_2)
.build();
}
}
}
return INSTANCE;
}
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE IF NOT EXISTS new_table...
}
};
如果只想从头开始而不更新当前数据库,则可以删除它以强制创建数据库。
static RoomDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (RoomDatabase.class) {
if (INSTANCE == null) {
// do not forget to remove this line if it is not needed
context.getApplicationContext().deleteDatabase("your_database");
// Create database here
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
RoomDatabase.class, "your_database")...
...
答案 2 :(得分:0)
如果您不需要保存数据并且不关心它们,只想告诉Room您正在迁移,您可以使用.fallbackToDestructiveMigration()
这样的
database = Room.databaseBuilder(context.getApplicationContext(),
UsersDatabase.class, "Sample.db")
.fallbackToDestructiveMigration()
.build();
它将为您完成“卸载”。
您可以参考this article here