房间数据库迁移失败:ALTER TABLE 添加多列

13

我正在将我的数据库从版本3升级到版本4,并通过提供从版本3到版本4的迁移来完成。

以下是我的迁移代码:

private static Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(@NonNull SupportSQLiteDatabase database) {
      database.execSQL("ALTER TABLE caption_table ADD COLUMN localVideoUrl TEXT;");
      database.execSQL("ALTER TABLE caption_table ADD COLUMN postType TEXT");
      database.execSQL("ALTER TABLE caption_table ADD COLUMN videoUrl TEXT");
    }
};

这是创建房间数据库的代码:

this.mAppDataBase = Room.databaseBuilder(getApplicationContext(), AppDataBase.class, "my_db")
                        .addMigrations(MIGRATION_2_3, MIGRATION_3_4)
                        .build();

这是我在PostModel上添加的代码片段。
@Expose
private String postType;

@Expose
private String videoUrl;

@Expose
private String localVideoUrl;

public String getPostType() {
    return postType;
}

public void setPostType(String postType) {
    this.postType = postType;
}

public String getVideoUrl() {
    return videoUrl;
}

public void setVideoUrl(String videoUrl) {
    this.videoUrl = videoUrl;
}

public String getLocalVideoUrl() {
    return localVideoUrl;
}

public void setLocalVideoUrl(String localVideoUrl) {
    this.localVideoUrl = localVideoUrl;
}

以下是我得到的错误信息。该错误与房间实体的notNull属性无关。 ``` java.lang.IllegalStateException: 迁移未正确处理posts(com.myapp.Database.PostModel)。 预期: TableInfo{name='posts', columns={imageWidth=Column{name='imageWidth', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, localVideoUrl=Column{name='localVideoUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, authorImageLocalUrl=Column{name='authorImageLocalUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, videoUrl=Column{name='videoUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageLocalUrl=Column{name='imageLocalUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, postType=Column{name='postType', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, authorName=Column{name='authorName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageUrl=Column{name='imageUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, title=Column{name='title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, authorImageUrl=Column{name='authorImageUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageHeight=Column{name='imageHeight', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]} 找到: TableInfo{name='posts', columns={imageWidth=Column{name='imageWidth', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}, authorImageLocalUrl=Column{name='authorImageLocalUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageLocalUrl=Column{name='imageLocalUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, authorName=Column{name='authorName', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageUrl=Column{name='imageUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1}, title=Column{name='title', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, authorImageUrl=Column{name='authorImageUrl', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, imageHeight=Column{name='imageHeight', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]} ```

你最终找到了解决方案吗? - adriennoir
1
耶!我更新了房间版本,显然它起作用了。 - Ravindra Barthwal
@RavindraBarthwal 你看了我的答案吗?奇怪的是它与房间的版本有关,而不是实际的迁移代码。 - dglozano
1个回答

5
比较预期与发现的JSON数据,很明显,在您的日志中出现了错误,因为找到的表格没有您想要添加的3个新列:postTypevideoUrllocalVideoUrl(您可以使用此脚本来比较日志中的两个JSON对象) 问题可能在于您的迁移代码将新列添加到名为caption_table的表格中,而根据日志,失败的表格称为posts。请尝试调整迁移代码以将新列添加到正确的表格中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接