Room数据库升级,增加字段

room升级可以自动配置,官方文档有说明,新版本的库就行,看参考链接。向下面一样配置



is_my_attention是新添加的字段,配置完build一下,报如下的错:
/Users/zhongyili/work/AndroidStudioProjects/SohuModuleLibrary/sohuPush/src/main/java/com/sohu/sohuvideo/sohupush/data/SocketDatabase.java:26: 错误: New NOT NULL column'is_my_attention' added with no default value specified. Please specify the default value using @ColumnInfo. public abstract class SocketDatabase extends RoomDatabase { ^
意思是没有设置默认值,我们设置一个默认值

再build一下,还报错


这是注解自动生成的代码,居然报错,真是奇葩,也可能是没用对。
不纠结了,改成手动配置升级


升级成功了

Room和kotlin结合使用,升级数据库遇到奇葩问题

采用上面的升级方式,用koltin就有问题,真奇葩


这个怎么回事呀?还是注解自动生成代码出错了,为啥不能生成set方法呢?
后来猜想是不是名字带is导致的,把is删了结果可以了,奇葩吧

还有sqLite是不支持boolean类型的
在migrate()方法中执行SQL语句新增某字段时,该字段不能为BOOLEAN类型的,需要用 INTEGER 替换,如果不指定默认值,则系统默认为1也就是true,但是在写表Model 实体时,时可以定义Boolean类型的变量的,Room会自己转化为INTEGER。
深坑!! 表里是BOOLEAN类型,但是SQL语句需要用INTEGER

但是room还是可以使用boolean类型的,因为通过注解解析后会自动转换的

升级数据库遇到错误

08-15 12:37:05.291 14342 14669 E AndroidRuntime: java.lang.RuntimeException: Exception while computing database live data.
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:92)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at java.lang.Thread.run(Thread.java:919)
08-15 12:37:05.291 14342 14669 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Migration didn't properly handle: session_table(com.sohu.sohuvideo.sohupush.bean.Session).
08-15 12:37:05.291 14342 14669 E AndroidRuntime:  Expected:
08-15 12:37:05.291 14342 14669 E AndroidRuntime: TableInfo{name='session_table', columns={is_my_attention=Column{name='is_my_attention', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='0'}, last_msg_id=Column{name='last_msg_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, session_id=Column{name='session_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_session_id=Column{name='s_session_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_content=Column{name='s_content', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_show_time=Column{name='s_show_time', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_to_uid=Column{name='s_to_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, read_msg_id=Column{name='read_msg_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_send_time=Column{name='s_send_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_msgId=Column{name='s_msgId', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_category=Column{name='s_category', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, unread_count=Column{name='unread_count', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, last_show_time=Column{name='last_show_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_nick_name=Column{name='s_nick_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_local_id=Column{name='s_local_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_animation_already_do=Column{name='s_animation_already_do', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='0'}, first_show_time=Column{name='first_show_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_msgStatus=Column{name='s_msgStatus', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_local_uid=Column{name='s_local_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, user_uid=Column{name='user_uid', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, s_from_uid=Column{name='s_from_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
08-15 12:37:05.291 14342 14669 E AndroidRuntime:  Found:
08-15 12:37:05.291 14342 14669 E AndroidRuntime: TableInfo{name='session_table', columns={is_my_attention=Column{name='is_my_attention', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='0'}, last_msg_id=Column{name='last_msg_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, session_id=Column{name='session_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_session_id=Column{name='s_session_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_content=Column{name='s_content', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_show_time=Column{name='s_show_time', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_to_uid=Column{name='s_to_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, read_msg_id=Column{name='read_msg_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_send_time=Column{name='s_send_time', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_msgId=Column{name='s_msgId', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_category=Column{name='s_category', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, unread_count=Column{name='unread_count', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, last_show_time=Column{name='last_show_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_nick_name=Column{name='s_nick_name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_local_id=Column{name='s_local_id', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, first_show_time=Column{name='first_show_time', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, s_msgStatus=Column{name='s_msgStatus', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, s_local_uid=Column{name='s_local_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, user_uid=Column{name='user_uid', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, s_from_uid=Column{name='s_from_uid', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:177)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:417)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:317)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:145)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:106)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomDatabase.query(RoomDatabase.java:324)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.util.DBUtil.query(DBUtil.java:83)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at com.sohu.sohuvideo.sohupush.data.dao.SessionDao_Impl$10.call(SessionDao_Impl.java:1195)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at com.sohu.sohuvideo.sohupush.data.dao.SessionDao_Impl$10.call(SessionDao_Impl.java:1192)
08-15 12:37:05.291 14342 14669 E AndroidRuntime:    at androidx.room.RoomTrackingLiveData$1.run(RoomTrackingLiveData.java:90)


这种情况下msg插入字段的时候,在升级数据库的时候session表也得插入字段

    static final Migration migration_2_3 = new Migration(2, 3) {@Overridepublic void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE `msg_table` ADD COLUMN `animation_already_do` INTEGER NOT NULL DEFAULT 0");database.execSQL("ALTER TABLE `session_table` ADD COLUMN `s_animation_already_do` INTEGER NOT NULL DEFAULT 0");}};

这个要格外注意,一开始不知道怎么解决这个问题。后来使用自动升级配置,看看自动升级是怎么做的,才知道session中也需要插入字段

奇葩
自动升级生成的配置是

  public void migrate(@NonNull SupportSQLiteDatabase database) {database.execSQL("ALTER TABLE `msg_table` ADD COLUMN `animation_already_do` INTEGER NOT NULL DEFAULT 0");database.execSQL("ALTER TABLE `session_table` ADD COLUMN `s_animation_already_do` INTEGER DEFAULT NULL");}

用这个会报错,测试发现得用

database.execSQL("ALTER TABLE `session_table` ADD COLUMN `s_animation_already_do` INTEGER DEFAULT 0");

允许为空,而且默认值得是0

参考

android Room数据库新增BOOLEAN类型的坑
迁移 Room 数据库
将数据保存到本地数据库

最新文章

  1. 5 修改request对象变量_【总结】前端5大常见设计模式,代码一看你就懂!
  2. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)
  3. ajax跨域异常,ajax跨域问题
  4. ios第三方库和工具类
  5. 后备干部,究竟应该提拔什么样的员工?
  6. 谈谈我理解的文化包容性
  7. mysql 去重_mysql 去重留一
  8. Markdown —— 开源者必备的文字编辑工具
  9. 并发和Read-copy update(RCU)
  10. 学院后勤报修系统php_如何有效提升医院医疗设备故障报修问题?
  11. 洛谷P2680:运输计划(倍增、二分、树上差分)
  12. pthread_detach函数
  13. linux ip brd不一致_3 个方便的命令行网速度测试工具 | Linux 中国
  14. tde数据库加密_在其他服务器上还原启用了透明数据加密(TDE)的数据库
  15. Linux 系统如何更改主机名
  16. 篮球计时计分器c语言程序,C51的篮球计时计分器程序
  17. 自学QT之qss教程
  18. 【Excel】【行列转换:转置粘贴 or TRANSPOSE】
  19. SQL经典50查询语句案例_7(查询学过“叶平”老师所教的所有课的同学的学号、姓名)
  20. 基于C++MFC的学生成绩管理系统

热门文章

  1. 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是“打鱼”还是“晒网”?(考虑中间有几个闰年)
  2. 【NLP】千呼万唤始出来——GPT-3终于开源!
  3. 详解谷歌VR平台Daydream:有手柄就是不一样
  4. java-注解-自定义注解-注解解析
  5. android Wifi热点启动流程,[android]WIFI热点启动流程分析
  6. ISA服务器安装设置全集
  7. 2021年网络安全省赛--web隐藏信息探索解析(中职组)
  8. C++ 中 _T 含义及用途
  9. 删除日志文件 空间不释放
  10. java操作k8s api报错:SSLHandshakeException: should not be presented in certificate_request