Room使用createFromAssets从assets导入预填充数据库后无数据是什么原因?
问题排查及解决方案
优先级最高的可操作步骤,按顺序执行:
- 完全卸载测试设备/模拟器上的现有应用,清除所有本地缓存数据后重新安装运行。
createFromAsset仅在数据库首次创建时执行导入逻辑,若之前运行过程中已经生成过空数据库文件,后续安装不会再触发资源导入。 - 检查预填充数据库的版本号是否和代码注解匹配:
用DB Browser for SQLite打开assets目录下的GoodWordsAndFrequency.db,执行SQL语句PRAGMA user_version;,确认返回的数值和代码中@Database(entities = {BadWords.class, ValidWords.class}, version = 2)的version值完全一致。如果预填充库的版本号低于2,因为你开启了fallbackToDestructiveMigration,Room会在导入后直接销毁原有表并重建空表,导致所有数据丢失。 - 校验表结构完全匹配:
在app模块的build.gradle的defaultConfig配置块中添加以下代码,开启Room schema导出:
重新编译项目后,会在项目根目录的schemas文件夹下生成json格式的数据库结构文件,对比文件中定义的表结构、字段类型、约束条件(非空、主键、自增)和你预填充数据库的结构完全一致。只要存在任意不匹配,Room都会自动重建空表清空原有数据。javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } - 验证预填充数据库格式合规:确认assets下的数据库是标准SQLite3格式,未加密、未损坏。可以先新建一个只有少量测试数据的同名数据库替换原有文件,卸载重装测试是否能正常导入,排查是否是大文件导出时产生的损坏问题。
内容的提问来源于stack exchange,提问作者Ahnold
相关产品推荐
相关产品推荐

