房间持久性库:迁移期间出现奇怪的错误

时间:2017-10-24 14:09:15

标签: android database-migration android-room

我正在抓住这个错误。到目前为止,我找不到任何答案。我有旧的数据库,我正在迁移到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");
    }
};

当我运行程序时。我得到了#34;迁移结束"登录我的LogCat,但当我再次尝试访问数据库时,它会给我以下错误。

 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"来了。我尝试卸载,使缓存无效以及任何其他密切相关的解决方案。知道发生了什么事吗?如果您刚刚安装应用程序,它可以正常工作。只有在迁移后才会出现错误。根据我的日志cat,所有迁移步骤似乎都已完成,但仍然显示迁移未得到妥善处理。

2 个答案:

答案 0 :(得分:4)

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

  

机器人:allowBackup = “真”

因此,在尝试各种数据库时,谷歌实际上是在备份我的任何新创建的数据库及其结构,并在重新安装应用程序时自动恢复它们。因此我收到了这个有线错误。切换自动备份android:allowBackup="false"并重新安装应用后,我可以正确测试迁移。

我建议所有开发人员在将来遇到此类问题, SWITCH OFF 开发时自动备份。您可以在测试迁移后将其打开。

答案 1 :(得分:0)

以下是您迁移脚本中的主要问题:

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

在这里,您的实体类中有:

@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}

解决方案:更改您的迁移查询,例如:

ALTER TABLE'YOUR_TABLE'添加列'col1'文本

它将解决您的问题。

谢谢:)