- 在migrate()方法中执行SQL语句新增某字段时,该字段不能为BOOLEAN类型的,需要用 INTEGER 替换,如果不指定默认值,则系统默认为1也就是true,但是在写表Model 实体时,时可以定义Boolean类型的变量的,Room会自己转化为INTEGER。
深坑!! 表里是BOOLEAN类型,但是SQL语句需要用INTEGER
- 新增某字段类型为 String 时,在migrate()方法中执行SQL语句,该字段用 TEXT 类型进行声明
- 假设新增ctTime 字段的类型是int 或 long,在表UserModel 实体里, , 则在migrate()方法中执行SQL语句的时候ctTime 声明需为 INTEGER 类型,并且要加上 NOT NULL DEFAULT 0 ,如:"ALTER TABLE UserModel ADD COLUMN ctTime INTEGER NOT NULL DEFAULT 0" ,
如果不加 NOT NULL 则会报这个异常:java.lang.IllegalStateException: Migration didn't properly handle UserModel ,因为Room会默认根据你的数据实体UserModel来创建该字段的notNull=true,所以必须加上。
如果不加 DEFAULT 0 则会报这个异常:android.database.sqlite.SQLiteException: Cannot add a NOT NULL column with default value NULL (code 1):