Room Persistence Library:迁移期间的奇怪错误
Room Persistence Library: Weird Error during migration
这个错误让我抓狂。到目前为止我找不到任何答案。我有旧数据库,我正在将其迁移到 Persistence Room 库。但是,每当我进行迁移时,都会出现以下错误,
java.lang.IllegalStateException: Migration didn't properly handle.
我使用的代码如下:
@Entity(tableName = ROUTE_TABLE)
public class RouteData {
static final String ROUTE_TABLE = "name";
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
private int id;
@ColumnInfo(name = "col1")
private String col1;
//Other columns with exactly same as 'col1' just different names
//Getters and Setters
}
对于迁移,
Room.databaseBuilder(context.getApplicationContext(), MyData.class, DATABASE_NAME)
.addMigrations(MIGRATION_LATEST)
.fallbackToDestructiveMigration()
.build();
private static final Migration MIGRATION_LATEST = new Migration(9, 10) {
@Override
public void migrate(SupportSQLiteDatabase db) {
//Log.i("Tag" , "Migration Started");
//Migration logic
//Log.i("Tag" , "Migration Ended");
}
};
当我运行编程时。我在 LogCat 中得到 "Migration Ended" 登录,但是当我再次尝试访问数据库时,出现以下错误。
Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
Expected:
TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
Found:
TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
我不知道这个 "INTEGER" 会从哪里来。我尝试卸载、使缓存无效以及任何其他密切相关的解决方案。知道发生了什么事吗?如果您刚安装应用程序,它工作得很好。仅在迁移后出现错误。根据我的日志猫,所有迁移步骤似乎都已完成,但它仍然显示迁移未正确处理。
谢谢大家的帮助,但经过几天令人沮丧的调试后,我终于找到了答案。在我的应用程序清单中,自动备份已开启,
android:allowBackup="true"
因此,在尝试各种数据库时,google 实际上备份了我所有新创建的数据库及其结构,并在我重新安装应用程序时自动恢复它们。因此我得到了这个有线错误。一旦我关闭自动备份 android:allowBackup="false"
并重新安装应用程序,我就可以正确测试迁移了。
我对以后遇到此类问题的所有开发人员的建议,关闭开发时自动备份。您可以在测试迁移后将其打开。
您的迁移脚本中的主要问题如下:
Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
Expected:
TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
Found:
TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
在这里,在您的实体中 Class 您有:
@ColumnInfo(name = "col1")
private String col1;
但在您的迁移查询中,您可能会将 col1
添加为 INTEGER
来自你的错误:
预计:
columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}
找到 :
columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}
解决方案:将您的迁移查询更改为:
更改TABLE'YOUR_TABLE'添加列'col1'文本
它将解决您的问题。
谢谢:)
这个错误让我抓狂。到目前为止我找不到任何答案。我有旧数据库,我正在将其迁移到 Persistence Room 库。但是,每当我进行迁移时,都会出现以下错误,
java.lang.IllegalStateException: Migration didn't properly handle.
我使用的代码如下:
@Entity(tableName = ROUTE_TABLE)
public class RouteData {
static final String ROUTE_TABLE = "name";
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
private int id;
@ColumnInfo(name = "col1")
private String col1;
//Other columns with exactly same as 'col1' just different names
//Getters and Setters
}
对于迁移,
Room.databaseBuilder(context.getApplicationContext(), MyData.class, DATABASE_NAME)
.addMigrations(MIGRATION_LATEST)
.fallbackToDestructiveMigration()
.build();
private static final Migration MIGRATION_LATEST = new Migration(9, 10) {
@Override
public void migrate(SupportSQLiteDatabase db) {
//Log.i("Tag" , "Migration Started");
//Migration logic
//Log.i("Tag" , "Migration Ended");
}
};
当我运行编程时。我在 LogCat 中得到 "Migration Ended" 登录,但是当我再次尝试访问数据库时,出现以下错误。
Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
Expected:
TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
Found:
TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
我不知道这个 "INTEGER" 会从哪里来。我尝试卸载、使缓存无效以及任何其他密切相关的解决方案。知道发生了什么事吗?如果您刚安装应用程序,它工作得很好。仅在迁移后出现错误。根据我的日志猫,所有迁移步骤似乎都已完成,但它仍然显示迁移未正确处理。
谢谢大家的帮助,但经过几天令人沮丧的调试后,我终于找到了答案。在我的应用程序清单中,自动备份已开启,
android:allowBackup="true"
因此,在尝试各种数据库时,google 实际上备份了我所有新创建的数据库及其结构,并在我重新安装应用程序时自动恢复它们。因此我得到了这个有线错误。一旦我关闭自动备份 android:allowBackup="false"
并重新安装应用程序,我就可以正确测试迁移了。
我对以后遇到此类问题的所有开发人员的建议,关闭开发时自动备份。您可以在测试迁移后将其打开。
您的迁移脚本中的主要问题如下:
Caused by: java.lang.IllegalStateException: Migration didn't properly handle xxx.
Expected:
TableInfo{name='name', columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
Found:
TableInfo{name='name', columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}, ....}, foreignKeys=[]}
在这里,在您的实体中 Class 您有:
@ColumnInfo(name = "col1")
private String col1;
但在您的迁移查询中,您可能会将 col1
添加为 INTEGER
来自你的错误:
预计:
columns={col1=Column{name='col1', type='TEXT', notNull=false, primaryKeyPosition=0}
找到 :
columns={col1=Column{name='col1', type='INTEGER', notNull=false, primaryKeyPosition=0}
解决方案:将您的迁移查询更改为:
更改TABLE'YOUR_TABLE'添加列'col1'文本
它将解决您的问题。
谢谢:)