Android Room将预装数据库存储在缓存中是否属于正常现象?
结论
你遇到的这个现象不属于Room的预期正常行为,createFromAsset 加载的预装数据库默认会被写入应用内部存储的 data/data/[应用包名]/databases/ 目录,属于系统统计的「用户数据」范畴,不应该被算到缓存里。
问题原因
这个问题基本可以确定是Room版本的bug导致的:
- Room在执行
createFromAsset逻辑时,会先把assets里的预装数据库文件解压到应用缓存目录生成临时文件,完成完整性校验后再移动到正式的databases目录,同时自动删除临时文件。 - 2.4.0版本之前的Room存在已知的临时文件残留bug,会导致拷贝完成后临时文件没有被清理,甚至每次应用启动都重复生成临时文件,就会出现你看到的缓存占用过大的情况。
- 你每次修改Entity索引后都会更新assets里的预装数据库文件,Room检测到已安装的数据库和assets内的版本不匹配,会触发重新拷贝逻辑,生成新的临时文件,所以缓存大小会同步变化。
修复方案
- 优先升级Room版本到2.4.0及以上的稳定版,官方已经修复了这个临时文件残留的问题,升级后清理一次应用缓存,再打开应用就不会再出现缓存被数据库临时文件占用的情况。
- 如果暂时不方便升级Room版本,可以在数据库初始化完成后,主动遍历应用缓存目录,删除前缀为
room_copy_temp_的临时文件,不会影响正常的数据库使用。
额外排查点
如果升级版本后问题仍然存在,可以检查:
- 是否修改了Room的journal模式,开启了WAL的情况下会生成
.db-wal和.db-shm两个日志文件,部分定制ROM可能会把这两个文件统计到缓存中,这种情况可以通过调用db.query("PRAGMA journal_mode = TRUNCATE", null)强制改成传统日志模式验证,但会损失一部分写入性能。 - 确认你修改Entity索引后,同步更新了assets内的预装数据库版本,避免Room重复触发拷贝逻辑。
内容的提问来源于stack exchange,提问作者lexler
相关产品推荐
相关产品推荐

