当前位置: 首页 > 知识库问答 >
问题:

Room持久性库:迁移过程中的奇怪错误

邵鸿福
2023-03-14
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”日志,但当我再次尝试access数据库时,它给我以下错误。

 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=[]}

我完全不知道这个“整数”要到哪里去。我尝试了卸载,使缓存无效和任何其他密切相关的解决方案。知道这是怎么回事吗?如果你刚安装应用程序,它的工作非常好。只有在迁移后才会出现错误。根据我的日志猫,所有迁移步骤似乎都已完成,但仍然显示迁移没有正确处理。

共有1个答案

颜志业
2023-03-14

谢谢大家的帮助,但是经过几天令人沮丧的调试,我终于找到了答案。在我的应用程序清单自动备份是打开的,

Android:allowBackup=“true”

所以在试用各种数据库的同时,谷歌实际上会备份我所有新创建的数据库及其结构,并在我重新安装应用程序时自动恢复它们。因此我得到了这个有线错误。一旦我切换自动备份android:allowbackup=“false”并重新安装应用程序,我就可以正确地测试迁移。

 类似资料:
  • 下面是Kotlin中的类: 但当我试图运行应用程序时,它立即崩溃。以下是崩溃日志: 类似乎不是自动生成的。我检查了从codelab下载的原始java应用程序,发现是自动生成的。

  • 我正在使用Maven和JPA编写一个项目(不是web应用程序!)。 我编写了带注释的实体类和CRUD服务类。但是现在,我需要使用而不是来执行这些CRUD操作。 我使用Hibernate作为JPA提供程序,并且在resources文件夹下的上配置了所有内容,目前运行正常。 我知道为了创建像 , 那么我必须在META-INF下使用,但我没有这个XML。 这是我的hibernate.cfg.xml

  • 我试图通过新的android room库更新我的数据库,但它不起作用。这就是我的方法 主要活动。JAVA CarViewModel。JAVA 卡ao.java 我做了调试,新数据出现并调用viewModel。updateItems(list)方法。提前谢谢!

  • 当我在Android上从旧的sqlite方式迁移到Room时,我需要使用“integer NOT null”来编译。问题是,当迁移发生时,您在新表中插入了带有“not NULL”参数的NULL字段,而我得到了错误 Android.database.sqlite.sqliteConstraintException:NOT NULL约束失败:note.notification_state(代码1299

  • 我正在寻找从经典Akka持久化迁移到Akka持久化类型。在这里找到的Lagom留档:1说“注意:从Lagom持久化(经典)迁移到Akka持久化类型时的唯一限制是需要完全关闭集群。即使所有持久数据都是兼容的,Lagom持久化(经典)和Akka持久化类型也不能共存。” 有人知道这是否适用于服务器可能知道的所有持久实体吗?例如,我使用的服务有3个独立的持久实体。我需要一次迁移所有3个,还是可以一次迁移一

  • 我正在使用android的房间持久性库,如果有人能帮助我使用外键,如何通过使用外键获取数据,我将不胜感激。