You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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导出:
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
        }
    }
    
    重新编译项目后,会在项目根目录的schemas文件夹下生成json格式的数据库结构文件,对比文件中定义的表结构、字段类型、约束条件(非空、主键、自增)和你预填充数据库的结构完全一致。只要存在任意不匹配,Room都会自动重建空表清空原有数据。
  • 验证预填充数据库格式合规:确认assets下的数据库是标准SQLite3格式,未加密、未损坏。可以先新建一个只有少量测试数据的同名数据库替换原有文件,卸载重装测试是否能正常导入,排查是否是大文件导出时产生的损坏问题。

内容的提问来源于stack exchange,提问作者Ahnold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 09:36:03