java - 向实体添加新字段

标签 java android android-room database-migration

我创建了一个director

@Entity(tableName = "director")
public class Director {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "did")
    public int id;

    @ColumnInfo(name = "full_name")
    @NonNull
    public String fullName;


    public Director(@NonNull String fullName) {
        this.fullName = fullName;
    }
}

我决定通过添加迁移方法并向类添加字段来添加新列

@Entity(tableName = "director")
public class Director {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "did")
    public int id;

    @ColumnInfo(name = "full_name")
    @NonNull
    public String fullName;

    @ColumnInfo(name = "age")
    public int age;

    public Director(@NonNull String fullName) {
        this.fullName = fullName;
    }
}

方法

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {

        String query = "ALTER TABLE 'director' ADD COLUMN 'age' INTEGER ";

        database.execSQL(query);

    }
};

当我执行代码时出现此错误

Caused by: java.lang.IllegalStateException: Migration didn't properly handle

它说它是预期的

age=Column{name='year', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, 

发现了

age=Column{name='year', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, 

我可以看到问题出在“notnull”部分,但如何解决这个问题?我希望它为空。

最佳答案

尝试将默认年龄值设置为 0

 static final Migration MIGRATION_1_2 = new Migration(1, 2) {

  @Override
  public void migrate(SupportSQLiteDatabase database) {
    database.execSQL(
      "ALTER TABLE 'director' ADD COLUMN 'age' INTEGER NOT NULL DEFAULT 0"
     );
  }
};

关于java - 向实体添加新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60774126/

相关文章:

android - 从 url 加载图像到 Recyclerview

android - Room SQLite 文件 - 确保刷新所有更改并且在文件上传过程中没有 I/O

android-room - 如何抑制android-room警告: Primary key constraint on id is ignored when being merged into Foo

java - 如何在一个类中使用来自不同 xml 文件的按钮

java - 如何在 Android 中使用 HTTP GET?

安卓数据库

android - 将任何节点索引到Firebase后,如何在Android中查询?我可以对超过 10 万个子节点使用 startAt() 和 EndAt() 函数吗?

java - 如何在 Lotus Domino Java 代理中获取 HTTP header (授权)?

java - Java中如何在不使用IP的情况下获取MAC地址?

android - 使用 concat 从 DB 请求数据,如果它从 Service 中空获取不工作?