Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在设备上调试sqlite数据库_Android_Sqlite_Adb - Fatal编程技术网

Android 在设备上调试sqlite数据库

Android 在设备上调试sqlite数据库,android,sqlite,adb,Android,Sqlite,Adb,我目前正在为Android开发WiFi应用程序。我在尝试访问设备上的数据库时遇到问题。在模拟器中调试对我来说不起作用,因为模拟器中没有WiFi支持。我尝试使用 adb pull data/data/package-name/databases/database-name 但我得到的错误是“权限被拒绝”。 在这个答案中,Commonware建议通过在调试模式下运行来提取数据库文件。但它也不起作用。非常感谢您提供有关如何在不使用根设备的情况下调试数据库的任何帮助。您需要以根用户身份运行adb,或者

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

adb pull data/data/package-name/databases/database-name
但我得到的错误是“权限被拒绝”。
在这个答案中,Commonware建议通过在调试模式下运行来提取数据库文件。但它也不起作用。非常感谢您提供有关如何在不使用根设备的情况下调试数据库的任何帮助。

您需要以根用户身份运行adb,或者在根设备上使用adb

要以root用户身份运行adb,请使用
adb root


另请参见:

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


请看这篇文章:

如果apk是可调试的,那么有一种方法可以使用(非根)adb shell中名为run as的程序来复制应用程序的私有文件

我将重复以下内容:

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

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

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

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

我在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 ~/
接受参数[包名称][数据库]的脚本

#!/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
如果你得到

The system cannot find the path specified.
试一试

注意双引号

我只是做了:

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

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

这里是一步一步的说明-大部分来自其他答案的组合。这适用于未解锁的设备

  • 连接设备并以调试模式启动应用程序

  • 将数据库文件从应用程序文件夹复制到sd卡:执行:

    ./adb-d shell“作为com.yourpackge.name cat/data/data/com.yourpackge.name/databases/filename.sqlite>/sdcard/filename.sqlite运行”

  • 将数据库文件拉入计算机:执行:

    ./adb拉取/sdcard/执行:./adb

  • 安装Firefox SQLLite管理器:

  • 打开Firefox SQLLite管理器并从上面的步骤3打开数据库文件

  • 享受吧


  • 在安卓4.4.2上,所有的
    运行方式和cat-to-SD卡解决方案都不适用于我。我不确定,但我怀疑这可能是由于
    运行方式
    工具未正确处理新的
    sdcard\u r
    sdcard\u rw
    权限造成的

    我首先必须将数据库文件复制到我的应用程序的私有内部存储中的
    /files

    shell@hammerhead:/ $ run-as com.example.myapp   
    shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb
    
    然后我复制到Javaland中的
    /sdcard/Android/data/com.example.myapp/files
    (这需要
    写入外部存储
    权限):

    最后,我将文件复制到我的笔记本电脑:

    $ adb pull /sdcard/Android/data/com.example.myapp/files/mydb
    

    查看和管理android应用程序数据库的最佳方法是使用此库

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

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

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

    您可以在此处查看1分钟的演示:

    我的设备没有SD卡,因此第一个解决方案对我不起作用

    如果您遇到类似问题,请尝试以下方法:

      adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
      adb pull /data/data/package/databases/yourdb.sqlite
    
    尝试此应用程序:SQLiteWeb()。它提供对数据库的远程访问,而无需将其拔出

    在付费版本中,它对私有数据库(/data/data/package name…)具有根访问权限,或者使用SQLiteWeb(应用程序内的说明)实现内容提供商连接

    但如果您想继续使用免费版本,可以在外部存储中创建数据库:

    database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
            + "/" + DATABASE_NAME, null, DATABASE_VERSION);
    

    在OSX上,将@Tadas answer与automator和sqllitebrowser()一起使用:

  • 打开Automator并创建新工作流

  • 添加“运行Shell脚本”操作

  • 粘贴以下内容:

    source~/.bash_配置文件 adb shell“以cat/data/data/your_app\u uid/databases/db.name>/tmp/db.name运行” adb pull/tmp/db.name~/ 打开-a sqlitebrowser~/db.name

  • 单击“运行”以刷新sqlitebrowser上的数据库


  • 虽然这是一个老问题,但我认为它仍然是相关的,应该得到当前状态的答案。有一些可用的工具,允许您直接检查数据库(无需从设备或模拟器中提取数据库)

    我最近发现(也是最喜欢)的工具是

    您只需添加此依赖项:

    debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
    
    不需要进一步的代码。 启动应用程序后,打开日志
    database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()
            + "/" + DATABASE_NAME, null, DATABASE_VERSION);
    
    debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
    
    D/DebugDB: Open http://192.168.178.XXX:8080 in your browser