在设备上调试sqlite数据库

Pri*_*han 94 sqlite android adb

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

adb pull data/data/package-name/databases/database-name
Run Code Online (Sandbox Code Playgroud)

但我收到错误"Permission denied.".在这个答案Android:数据库文件存储在哪里?,Commonsware建议通过在调试模式下运行来提取数据库文件.但它也不起作用.任何有关如何调试数据库而不需要设备生根的帮助将非常感激.

Ido*_*lon 140

我将从另一个答案重复一遍:

从API级别8(Android 2.2)开始,如果您将应用程序构建为可调试的,则可以使用shell run-as命令将命令或可执行文件作为特定用户/应用程序运行,或者只需切换到UID应用程序的应用程序即可访问其数据目录.

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

run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite
Run Code Online (Sandbox Code Playgroud)

这会将您复制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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个很好的oneliner,你可以在adb shell之外运行:`adb shell'run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite>/sdcard/dbname.sqlite'` (14认同)
  • 在Android棒棒糖上,我得到了"许可被拒绝" (4认同)
  • package <my package>未知......任何人都知道原因.我通过按下调试按钮安装了工作室. (2认同)

Tad*_*tis 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 ~/
Run Code Online (Sandbox Code Playgroud)

接受参数的脚本[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
Run Code Online (Sandbox Code Playgroud)


san*_*h_p 14

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

使用此库,您可以从应用程序本身管理您的应用程序SQLite数据库.您可以查看应用数据库中的表,更新,删除,向表中插入行.从您的应用程序中获取所有内容.

它是一个单独的java活动文件,只需将java文件添加到源文件夹中.当开发完成后,从你的src文件夹中删除java文件.

它给了我很多帮助.希望它也可以帮到你.

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

  • 超级男人,看到我们的DbEntry非常有用.它的修改是一个额外的事情. (2认同)

Pet*_*r F 8

虽然,这是一个老问题,我认为它仍然相关,值得当前的州回答.有一些工具可供您直接检查数据库(无需从设备或模拟器中提取数据库).

我最近发现(并且最受青睐)的工具是Android调试数据库.

您只需要添加此依赖项:

debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
Run Code Online (Sandbox Code Playgroud)

无需其他代码.启动应用程序后,打开logcat并过滤"DebugDB",您会看到一条消息说明

D/DebugDB: Open http://192.168.178.XXX:8080 in your browser
Run Code Online (Sandbox Code Playgroud)

它适用于每个浏览器,您可以检查数据库表和共享首选项.

在此输入图像描述

它也适用于默认和Genymotion模拟器.


我之前使用的工具是stetho.

缺点:您需要添加一些代码,并且您必须使用Chrome浏览器.

优点:您还可以选择检查网络流量.


jep*_*bio 6

在新的Android Studio 4.1中,有新的Database Inspector

https://i.ibb.co/9tNM1xg/database-Inspector.gif

您可以从菜单栏中选择以下选项View > Tool Windows > Database Inspector来打开它(App Inspector在 Android Studio 4.2 中)。更详细的说明可以在这篇博客Exploring the Database Inspector in Android Studio 中的文章中找到。

另一种方法是使用stetho。您添加依赖项,然后可以在设备插入时使用 Chrome DevTools ( chrome://inspect ) 检查数据库。


zzz*_*zzz 5

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

看看这篇文章:在Android上对SDCard进行数据库备份


Ger*_*ger 5

如果你得到

The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)

尝试

adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite"
Run Code Online (Sandbox Code Playgroud)

注意双引号!