会议室数据库迁移失败:ALTER TABLE添加多个列

时间:2018-06-21 15:23:31

标签: android-room

我正在通过从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',   finity ='3',notNull = true,primaryKeyPosition = 0},   localVideoUrl = Column {name ='localVideoUrl',type ='TEXT',affinity ='2',   notNull = false,primaryKeyPosition = 0},   authorImageLocalUrl = Column {name ='authorImageLocalUrl',type ='TEXT',   finity ='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',   finity ='2',notNull = false,primaryKeyPosition = 0},   authorImageUrl =列{名称='authorImageUrl',类型='TEXT',   finity ='2',notNull = false,primaryKeyPosition = 0},   imageHeight = Column {name ='imageHeight',type ='INTEGER',affinity ='3',   notNull = true,primaryKeyPosition = 0}},foreignKeys = [],索引= []}

     

发现:       TableInfo {name ='posts',columns = {imageWidth = Column {name ='imageWidth',type ='INTEGER',   finity ='3',notNull = true,primaryKeyPosition = 0},   authorImageLocalUrl = Column {name ='authorImageLocalUrl',type ='TEXT',   finity ='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',   finity ='2',notNull = false,primaryKeyPosition = 0},   authorImageUrl =列{名称='authorImageUrl',类型='TEXT',   finity ='2',notNull = false,primaryKeyPosition = 0},   imageHeight = Column {name ='imageHeight',type ='INTEGER',affinity ='3',   notNull = true,primaryKeyPosition = 0}},foreignKeys = [],索引= []}

1 个答案:

答案 0 :(得分:3)

比较日志中的“期望”与“发现” JSON,显然会发生错误,因为找到的表没有要添加的3个新列:postType,{{1} }和videoUrl(You can use this script to compare both JSON objects from the log)

问题可能是在迁移代码中,您正在将新列添加到名为localVideoUrl的表中,而根据日志,失败的表称为caption_table。尝试调整您的迁移代码,以将新列添加到适当的表中。