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

如何从安卓APP导出数据库?使用ADB run-as导出得到空数据库怎么办

问题原因

你导出的文件为空是因为Room默认启用**WAL(预写日志)**机制,新增/修改的数据默认会存储在同目录下的file.db-wal、file.db-shm两个附属文件中,你单独导出file.db只会拿到未更新的原始数据库文件。

解决方案

方案1:临时关闭WAL模式(最便捷,适合一次性导出预制库场景)

在你的Room数据库初始化代码中,设置日志模式为TRUNCATE,强制所有数据直接写入主db文件:

// Kotlin示例
Room.databaseBuilder(context, AppDatabase::class.java, "file.db")
    .setJournalMode(RoomDatabase.JournalMode.TRUNCATE) // 新增这行
    .build()

修改后重新运行app写入数据,确认数据写入完成后,再执行你原来的导出命令即可拿到完整数据的db文件:
adb exec-out run-as com.group.project cat databases/file.db > file.db
导出完成后可以把journalMode的配置改回默认值,不影响正常使用。

方案2:导出全部三个数据库相关文件(无需修改代码)

如果不想改动现有代码,需要同时导出主db和两个附属文件,再用本地sqlite工具合并:

  1. 依次执行三个导出命令:
adb exec-out run-as com.group.project cat databases/file.db > file.db
adb exec-out run-as com.group.project cat databases/file.db-wal > file.db-wal
adb exec-out run-as com.group.project cat databases/file.db-shm > file.db-shm
  1. 本地执行sqlite命令提交WAL日志到主库:
    sqlite3 file.db "PRAGMA wal_checkpoint(TRUNCATE);"
    执行完成后,file.db就是包含全部数据的完整文件,file.db-wal、file.db-shm两个文件可以直接删除。

方案3:通过公共存储中转导出(适用于文件较大的场景)

如果数据库文件很大,cat命令可能出现截断,就用拷贝到公共存储再pull的方式:

# 进入app沙盒目录,把db相关文件拷到公共下载目录
adb shell run-as com.group.project cp databases/file.db* /sdcard/Download/
# 把文件pull到本地
adb pull /sdcard/Download/file.db .
adb pull /sdcard/Download/file.db-wal .
adb pull /sdcard/Download/file.db-shm .
# 执行合并命令即可
sqlite3 file.db "PRAGMA wal_checkpoint(TRUNCATE);"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:27:01