Device File Explorer导出数据库文件为空但应用可正常读取如何解决?
Android数据库导出为空排查方案
- 检查事务提交状态
若插入数据时开启了事务未正确提交,数据会暂存在应用内存缓存中,未写入磁盘文件。使用原生SQLiteDatabase时需确保调用beginTransaction()后,执行完操作调用setTransactionSuccessful()再执行endTransaction();使用Room等ORM框架时需确认异步事务任务已执行完成。 - 排查WAL(预写日志)模式影响
目前大部分Android SQLite默认开启WAL模式,写入的数据会先暂存在与主库同名的.db-wal、.db-shm文件中,仅当checkpoint触发时才会合并到主.db文件。如果仅导出主.db文件打开就会显示为空,解决方式有两种:方式一:导出数据库时将同目录下
.db、.db-wal、.db-shm三个文件同时导出到本地同一文件夹,再打开主.db文件即可读取到完整数据
方式二:在导出前手动触发WAL合并,执行SQL命令PRAGMA wal_checkpoint(TRUNCATE);将所有日志数据合并到主库文件后再导出 - 确认数据库路径与导出权限
检查Device File Explorer中定位的路径是否正确:应用私有目录下的数据库默认路径为/data/user/[当前用户ID]/[应用包名]/databases/,多用户/工作profile场景下不要误用/data/data/[包名]/databases/路径。如果Device File Explorer导出异常,可以使用adb命令直接拉取文件:
导出前可以先完全杀掉应用进程,避免数据库文件被锁导致导出不完整。adb exec-out run-as 你的应用包名 cat databases/你的数据库文件名.db > 本地存储路径/db文件名.db - 校验本地数据库查看工具兼容性
部分低版本SQLite查看工具无法识别高版本SQLite格式,或者未读取同目录下的WAL文件,会误判文件为空。可以更换为SQLiteStudio、DB Browser for SQLite等工具,将三个关联文件放在同一目录后重新打开主库文件验证。
内容的提问来源于stack exchange,提问作者LovelyCat
相关产品推荐
相关产品推荐

