在设备上调试sqlite数据库

99

我目前正在为Android开发一个WiFi应用程序。我在尝试访问设备上的数据库时遇到了麻烦。在模拟器中进行调试对我来说行不通,因为模拟器中没有WiFi支持。我尝试使用拉取数据库文件从设备中提取出数据库文件。

adb pull data/data/package-name/databases/database-name

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

143
我会从另一个答案中重复一遍:
从API级别8(Android 2.2)开始,如果您将应用程序构建为可调试的,则可以使用shell run-as命令以特定用户/应用程序的身份运行命令或可执行文件,或者只需切换到您的应用程序的UID,以便访问其data目录。
将文件复制到设备上的外部存储
因此,如果您希望从设备中提取应用程序数据库,可以从Android Studio启动应用程序的调试版本,使用adb shell连接,并运行以下命令:
run-as com.your.package sh -c "cat ~/databases/db-file.db" > /sdcard/db-file.db

或者你可以使用一个更短的版本,它使用相对路径并跳过对主目录的引用~,这样就可以省略sh -c部分了。
run-as com.your.package cat databases/db-file.db > /sdcard/db-file.db

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

直接将文件复制到计算机

您还可以使用以下命令直接将数据库复制到计算机:

adb shell 'run-as com.your.package cat databases/db-file.db' > db-file.db

上面的adb shell命令在Windows主机上不会正常工作,因为会发生CR/LF符号转换,除非您从bash shell中运行它或者使用未记录的adb exec-out命令(一些评论提到他们仍然无法在Windows机器上正确运行,所以结果可能有所不同)。
adb exec-out 'run-as com.your.package cat databases/db-file.db' > db-file.db

将文件写回设备

如果您在计算机上修改了文件并希望将修改写回设备,请使用以下命令:

adb exec-in 'run-as com.your.package tee databases/db-file.db' < db-file.db

如果你更喜欢使用文档未提及的exec-in,而不是adb shell版本,请使用以下命令(但请阅读关于Windows CR/LF转换的注意事项):
adb shell 'run-as com.your.package tee databases/db-file.db' < db-file.db >/dev/null
状态更新

截至2023年7月,以上所有命令仍然有效。


1
@MikeIsrael 以防万一,你的应用程序中没有使用SQLCipher吧?如果没有,请打开查看器(最好是十六进制查看器)中的DB文件,检查它是否以“SQLite format 3”字符串开头,以大致检查数据库是否已正确下载。还要确保您有正确的sqlite版本(即您不尝试使用sqlite2可执行文件打开sqlite3数据库)。您还可以尝试其他SQLite客户端(例如[SQLiteStudio](http://sqlitestudio.one.pl/))。希望这有所帮助。 - Idolon
1
我在使用一行命令时遇到了问题。如果我在shell中运行该命令,它可以正常工作,但是如果我将其放入一行命令中,我会收到以下错误信息: 系统找不到指定的路径。 - Rev Tyler
2
包 <my package> 未知... 有人知道为什么吗?我通过按下调试按钮在工作室中安装了它。 - Nathan Schwermann
4
在安卓棒棒糖系统上,我遇到了“权限被拒绝”的错误提示。 - Muhammad Babar
1
我提取了一个包含两个表格和每个表格中大约十几行数据的数据库,并对每个表格进行了完整的查询。其中一个表格正常工作,而另一个表格报告文件中的数据错误。我目前最好的猜测是Android和本地shell之间存在编码不匹配的问题。 - Mason
显示剩余16条评论

23

我在我的MAC上使用这个shell脚本,它直接将数据库复制到我的主文件夹中。只需更改包名称(com.example.app)和数据库名称(database.sqlite),就可以轻松实现一键解决方案。

简单脚本

#!/bin/bash
adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite'
adb pull /sdcard/database.sqlite ~/

编写一个接收参数 [package_name] [database] 的脚本

#!/bin/bash

REQUIRED_ARGS=2
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb
PULL_DIR="~/"

if [ $# -ne $REQUIRED_ARGS ]
    then
        echo ""
        echo "Usage:"
        echo "android_db_move.sh [package_name] [db_name]"
        echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db"
        echo ""
    exit 1
fi;


echo""

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' "
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR"

echo $cmd1
eval $cmd1
if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

echo $cmd2
eval $cmd2

if [ $? -eq 0 ]
    then
    echo ".........OK"
fi;

exit 0

第一条命令是创建一个零字节的数据库副本,因此我在您的脚本中进行了一些调整: https://gist.github.com/romulof/6af8a8919660f395f975 - romulof

15

浏览和管理您的Android应用程序数据库最佳方法是使用此库https://github.com/sanathp/DatabaseManager_For_Android

使用此库,您可以从您的应用程序本身管理应用程序SQLite数据库。您可以查看应用程序数据库中的表格,并更新、删除、插入行到您的表格中。所有这些都来自于您的应用程序。

它是一个单一的Java活动文件,只需将Java文件添加到源文件夹即可。开发完成后,从源文件夹中删除Java文件即可。

它帮助了我很多。希望它也能帮到你。

您可以在这里查看1分钟演示:http://youtu.be/P5vpaGoBlBY


13
尽管这是一个老问题,但我认为它仍然相关并值得一个当前状态的回答。有一些可用的工具,可以让你直接检查数据库(无需从设备或模拟器中提取)。
我最近发现并最喜欢使用的工具是Android Debug Database
你只需要添加这个依赖项:
debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'

不需要进一步的代码。 启动应用程序后,打开logcat并过滤“DebugDB”,您将找到一条消息,其中说

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser

它与所有浏览器兼容,您可以检查您的数据库表和共享偏好设置。

enter image description here

它还可以与默认和Genymotion模拟器一起使用。


我之前使用的工具是stetho
缺点:你需要添加一些代码,并且只能在Chrome浏览器中使用。
优点:你也可以检查网络流量。

6

3
这是2020年及以后的最佳选择。 - Yair Kukielka

5

如果你遇到了

The system cannot find the path specified.

尝试

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"

请注意双引号!

我尝试了这个,它创建了文件,但是文件大小为0kb。 - Ray Brennan

5

我在我的应用程序中将数据库导出到SD卡上。一旦数据库在SD卡上,就可以通过将设备插入计算机来访问它。

看看这篇帖子:在Android上将数据库备份到SD卡


3
Android Studio 4.1新增了一个功能,可以查看/编辑Android SQLite数据库。

enter image description here

如何打开数据库检查器

要在Android Studio中打开数据库检查器,您需要从菜单栏中选择View > Tool Windows > Database Inspector

此外,您需要将应用程序运行到API级别为26或更高的设备上。

使用此工具,您可以:

  • 查询您的数据库

  • 修改和调试您的数据库

enter image description here


3

我只是做了以下操作:

$ adb shell
shell@android:/ $ run-as myapp.package.name sh
shell@android:/data/data/myapp.package.name $

然后我可以使用正确的权限从shell调试sqlite数据库或其他我想要做的事情。


2

以下是逐步说明 - 大部分内容摘自其他答案的结合。此方法适用于未解锁设备。

  1. 连接您的设备并以调试模式启动应用程序。

  2. 将数据库文件从应用程序文件夹复制到SD卡中:执行:

    ./adb -d shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite > /sdcard/filename.sqlite'

  3. 将数据库文件拉取到您的计算机上:执行:

    ./adb pull /sdcard/ execute: ./adb

  4. 安装Firefox SQLLite Manager:https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. 打开Firefox SQLLite Manager并打开您在第3步中的数据库文件。

  6. 享受!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接