在设备上debuggingsqlite数据库

我目前正在为Android安装WiFi应用程序。 我在尝试访问设备上的数据库时遇到问题。 在模拟器中debugging不适用于我,因为在模拟器中没有WiFi支持。 我试图通过使用拉出数据库文件

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

但是我得到错误“权限被拒绝”。 在这个答案Android:数据库文件存储在哪里? Commonswarebuild议通过在debugging模式下运行来提取数据库文件。 但是这也行不通。 任何帮助如何debugging数据库,而不需要设备的根源将不胜感激。

我会从另一个答案重复自己:

从API级别8(Android 2.2)开始,如果将应用程序构build为可debugging应用程序,则可以使用shell run-as命令作为特定用户/应用程序运行命令或可执行文件,或切换到应用程序的UID ,可以访问它的数据目录。

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

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

这将复制你的db-file到你的SD卡/外部存储的根目录。 现在你可以通过使用文件pipe理器, 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上无法正常工作。 在那里使用以前的方法。

我在我的MAC上使用这个shell脚本,将数据库直接复制到我的home文件夹。 简单的一键解决scheme,只需更改软件包名称(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 

查看和pipe理你的Android应用程序数据库的最好方法是使用这个库https://github.com/sanathp/DatabaseManager_For_Android

有了这个库,您可以从您的应用程序本身pipe理您的应用程序SQLite数据库。 您可以查看您的应用程序数据库中的表格,更新,删除,插入行到您的表格。从您的应用程序的一切。

它的一个单一的Java活动文件,只是将Java文件添加到您的源文件夹。当开发完成从您的src文件夹删除java文件多数民众赞成它。

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

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

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

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

如果你得到

 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" 

注意双引号!

我只是做了:

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

然后,我可以debugging一个SQLite数据库或任何我想要从正确的权限的shell做。

如果一个apk可debugging使用一个名为run-as的程序(非根)adb shell来复制应用程序的私有文件,那么有一种方法。

这里是一步一步的说明 – 主要是从其他答案的组合。 这适用于未解锁的设备。

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

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

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

  3. 把数据库文件拉到你的机器上:execute:

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

  4. 安装Firefox SQLLitepipe理器: https ://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. 打开Firefox的SQLLitepipe理器,并从上面的步骤3打开您的数据库文件。

  6. 请享用!

您需要以root用户身份运行adb,或者在根用户的手机上使用它。

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

另请参阅: 使用adb时,为什么我的数据文件夹访问被拒绝?

在Android 4.4.2上,没有任何一个run-as和猫到SD卡的解决scheme为我工作。 我不确定,但我怀疑这可能是由于run-as工具不能正确处理新的sdcard_rsdcard_rw权限。

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

 shell@hammerhead:/ $ run-as com.example.myapp shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb 

然后我复制到/sdcard/Android/data/com.example.myapp/files/sdcard/Android/data/com.example.myapp/files (这需要WRITE_EXTERNAL_STORAGE权限):

 public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { ... if (isExternalStorageWritable()) { final FileInputStream input; try { input = openFileInput("mydb"); File output = new File(getExternalFilesDir(null), "mydb"); copy(input, output); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void copy(FileInputStream in, File dst) throws IOException { OutputStream out = new FileOutputStream(dst); // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state); } } 

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

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

我的设备没有SD卡

所以第一个解决scheme不适合我。

如果您遇到类似问题,请尝试如下所示:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite"; adb pull /data/data/package/databases/yourdb.sqlite 

试试这个应用程序:SQLiteWeb( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb )。 它提供对数据库的远程访问,而不必将其拔出。

在付费版本中,它具有专用数据库(/ data / data / package-name …)的根访问权限,或者实现一个使用SQLiteWeb(应用程序内部指令)

但是如果想要保留免费版本,你可以在外部存储中创build你的数据库:

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

在OSX上,使用@Tadas回答automator和sqllitebrowser( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. 打开Automator并创build新的工作stream程。

  2. 添加“运行Shell脚本”操作。

  3. 贴上这个:

    source〜/ .bash_profile adb shell'run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name'adb pull /tmp/db.name〜/ open -a sqlitebrowser〜/ db。名称

  4. 点击运行刷新sqlitebrowser上的数据库。