使用Room预填充数据库时出现Pre-packaged database invalid schema错误
错误根因定位
从抛出的日志可以直接看到两个核心不匹配点:
- Room期望的
EnglishMarathi表结构中没有englishTyped字段,但你内置的预打包数据库里的EnglishMarathi表多了这个字段,结构不一致直接触发校验失败 - 你后续贴的schema配置对应的是
MarathiEnglish表,和报错的EnglishMarathi是两张不同的表,存在表名配置混淆的问题
排查解决步骤
- 核对实体类与预打包库的字段匹配
检查你定义的EnglishMarathi实体类,如果业务需要englishTyped字段,就在实体类中新增该字段,声明为可空String类型即可;如果不需要该字段,就用DB Browser Lite打开预打包数据库,删除EnglishMarathi表中的englishTyped列,保证两者字段完全一致。 - 核对表名配置
确认你的业务实际用到的表名:- 如果用的是
EnglishMarathi表,检查实体类上@Entity注解的tableName属性是否为EnglishMarathi,同时对照自动生成的schema.json中对应表的createSql语句,完全照搬该语句重新建预打包库的表 - 如果用的是
MarathiEnglish表,检查Room数据库类的entities参数是否已经添加了MarathiEnglish实体类,同时保证预打包库中有对应结构的MarathiEnglish表
- 如果用的是
- 建表后执行结构校验
用DB Browser Lite打开预打包数据库,执行PRAGMA table_info(你的表名),将输出的字段信息和Room错误日志中Expected的TableInfo逐行比对,要保证字段名、字段类型、非空约束、主键位置完全一致,任意一项不匹配都会触发校验错误 - 清理缓存后测试
修改完预打包数据库后,先卸载设备上已安装的旧App,清除本地已经生成的旧数据库缓存,再重新安装App测试,避免旧数据干扰校验结果。
内容的提问来源于stack exchange,提问作者Shreyash.K
相关产品推荐
相关产品推荐

