问题来源:geeendao数据库升级 版本3.2.2
解决办法:将添加字段的类型由基本类型改为包装类型即可
来由:原来的表对象添加了一个字段 age2,如下:
@Entity
public class User {
@Id
private Long id;
private Integer age;
private int age2;
private String name;
数据库升级后会报not null 异常,查看了对应生成的UserDao#createTable,建表语句中确实存在一个
**请注意:为了说明问题这里我在这里添加了2个字段,也就是说包装类型不会出现NOT NULL约束,有人可能会说直接手动将基本类型的NOT NULL去掉,这个是不可行的,这个文件是greendao差价自动生成的,改过之后,会再次添加 ****
““AGE” INTEGER,” + // 1: age
““AGE2” INTEGER NOT NULL ,”
private Integer age; private int age2;
public static void createTable(Database db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "\"USER\" (" + //
"\"_id\" INTEGER PRIMARY KEY ," + // 0: id
"\"AGE\" INTEGER," + // 1: age
"\"AGE2\" INTEGER NOT NULL ," + // 2: age2
"\"NAME\" TEXT," + // 3: name
"\"TEMP_USAGE_COUNT\" INTEGER NOT NULL );"); // 4: tempUsageCount
}
原来是添加了一个 long 类型的字段,现在改为添加成Long类型,Dao 中建表语句中 NOT NULL 就没了,就可以了
关于怎么升级,可以看这篇文章:但是最后关于 新的字段NUM为TEXT类型,一切正常!的表述有误,文章的意思是使用string类型代替long等基本类型,这样最后还的类型转换,太麻烦。直接使用包装类型即可。
greendao3.0以上使用步骤(二):数据库到底该怎么升级
https://blog.csdn.net/huangxiaoguo1/article/details/54574713
MigrationHelper.java升级数据库用到的类
https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#30334668
我是IT小王,如果喜欢我的文章,可以扫码关注我