android - 在设备上调试 sqlite 数据库

标签 android sqlite adb

我目前正在开发适用于 Android 的 WiFi 应用程序。我在尝试访问设备上的数据库时遇到问题。在模拟器中调试对我不起作用,因为模拟器中没有 WiFi 支持。我尝试使用

将数据库文件从设备中拉出
adb pull data/data/package-name/databases/database-name

但我收到错误“权限被拒绝。”。 在这个答案Android: Where are database files stored? , Commonsware 建议通过在 Debug模式下运行来拉取数据库文件。但它也不起作用。任何有关如何在不生根设备的情况下调试数据库的帮助将不胜感激。

最佳答案

我会重复 another answer :

Starting from API level 8 (Android 2.2), if you build the application as debuggable, you can use the shell run-as command to run a command or executable as a specific user/application or just switch to the UID of your application so you can access its data directory.

因此,如果您希望从设备中提取应用程序数据库,您应该运行应用程序的调试版本,连接 adb shell 并运行以下命令:

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite

这会将您的 db-file 复制到 SD 卡/外部存储的根目录。现在,您可以使用文件管理器、adb pull 或其他任何您喜欢的方式轻松地从那里获取它。请注意,使用这种方法,您的应用无需具有 WRITE_EXTERNAL_STORAGE 权限,因为复制是由始终可以写入外部存储的 shell 用户完成的。

在 Linux/Mac 系统上,可以使用以下命令直接将数据库复制到您的计算机,无需进入 adb shell 即可使用:

adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite

但是,由于 CR/LF 符号转换,这将无法在 Windows 上正常工作。在那里使用前一种方法。

关于android - 在设备上调试 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928849/

相关文章:

java - fragment 互通

php - mysql_num_rows 是否有效和/或标准做法?

swift - Cocoapod "pod spec lint"CompileSwift 返回不成功的退出代码

android - 亚行是什么?

android - 将 Android 升级到 4.3 后,run-as 说 'package is unknown'

java - 我可以在 VB.NET (Windows 7) 和 java (android) 之间发送数据来开发应用程序吗?

android - 在 View 下方显示 toast 小部件

java - Android SQLite 数据库更新架构而不丢失数据

android - 如何比较sqlite表的值和android中的json标签值

android - 初始化 ADB Android Studio 后没有显示任何设备