使用Room时部分API级别出现SQLiteException空列错误
问题分析与解决
根因
崩溃的核心原因是Android Oreo(API 26)搭载的SQLite版本(3.19.4)无法将TRUE识别为布尔字面量,会将其当作列名处理。而你的PlantView查询中使用了TRUE,导致SQLite找不到名为TRUE的列,触发SQLiteException。更高版本的Android(如API 30)使用了更新的SQLite版本,已经支持将TRUE作为布尔字面量解析,因此不会出现问题。
解决方案
修改Room的
PlantView定义:将查询中所有的TRUE替换为1(SQLite用整数1表示真,0表示假,兼容所有版本)。
示例修改:// 原定义 @DatabaseView("SELECT common_name, plantId, image_path, latin_name, language FROM PlantView ORDER BY common_name, TRUE") data class PlantView(...) // 修改后 @DatabaseView("SELECT common_name, plantId, image_path, latin_name, language FROM PlantView ORDER BY common_name, 1") data class PlantView(...)更新资产中的预构建数据库:由于你通过
createFromAsset加载预存数据库,需要手动修改该数据库文件中的PlantView视图定义,同样将TRUE替换为1,确保与Room的实体定义一致。清理并重建项目:修改Room注解后,需执行Clean Project和Rebuild Project操作,让Room重新生成DAO实现类,避免旧代码残留。
验证
重新在API 26设备/虚拟机上测试应用,确认崩溃不再发生。
内容的提问来源于stack exchange,提问作者Akronix
相关产品推荐
相关产品推荐

