web-dev-qa-db-ja.com

デバイスでのsqliteデータベースのデバッグ

現在、Android用のWiFiアプリケーションの開発に取り組んでいます。デバイス上のデータベースにアクセスしようとすると問題が発生します。エミュレータでのWiFiのサポートがないため、エミュレータでのデバッグは機能しません。を使用してデバイスからデータベースファイルを引き出してみました

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

しかし、「Permission denied。」というエラーが表示されます。この回答で Android:データベースファイルはどこに保存されますか? 、Commonswareはデバッグモードで実行してデータベースファイルをプルすることを提案しました。しかし、それも機能しません。デバイスをルート化せずにデータベースをデバッグする方法に関するヘルプをいただければ幸いです。

94

別の答え から繰り返します。

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-fileがSDカード/外部ストレージのルートにコピーされます。これで、ファイルマネージャ、adb pull、またはその他の任意のものを使用して、そこから簡単に取得できます。このアプローチでは、アプリがWRITE_EXTERNAL_STORAGE権限を持っている必要がないことに注意してください。コピーは常に外部ストレージに書き込むことができるシェルユーザーによって行われます。

Linux/Macシステムでは、adbシェルを入力せずに使用できる次のコマンドを使用して、データベースをコンピューターに直接コピーすることができます。

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

ただし、これはCR/LFシンボル変換のため、Windowsでは正しく機能しません。そこで前者の方法を使用してください。

139
Idolon

MACでこのシェルスクリプトを使用して、データベースを直接ホームフォルダーにコピーします。簡単なワンクリックソリューション、パッケージ名(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
23
Tadas Valaitis

Androidアプリデータベースを表示および管理する最良の方法は、このライブラリを使用することです https://github.com/sanathp/DatabaseManager_For_Android

このライブラリを使用すると、アプリ自体からアプリのSQLiteデータベースを管理できます。アプリデータベースのテーブルを表示、更新、削除、テーブルに行を挿入できます。アプリのすべて。

単一のJavaアクティビティファイル、Javaファイルをソースフォルダーに追加します。開発が完了したら、srcフォルダーからJavaファイルを削除します。 。

それは私を大いに助けてくれました。

ここで1分間のデモを見ることができます: http://youtu.be/P5vpaGoBlBY

14
sanath_p

とはいえ、それは古い質問であり、今でも関連性があり、現状の答えに値すると思います。利用可能なツールがあり、データベースを直接検査できます(デバイスやエミュレーターからデータベースをプルする必要はありません)。

このツールは、私が最近発見した(そして最も好意的な) 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ブラウザーにバインドされます。

利点:ネットワークトラフィックを検査するオプションもあります。

8
Peter F

あなたが取得する場合

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"

二重引用符に注意してください!

5

私のアプリケーションでは、データベースをSDカードにエクスポートします。データベースがSDカードに保存されると、デバイスをコンピューターに接続することでデータベースにアクセスできます。

この投稿を見てください: AndroidでのSDCardへのデータベースバックアップの作成

私は単にやった:

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

その後、sqliteデータベースまたは適切な権限でシェルから実行したいことをデバッグできます。

3
smichak

(非ルート)adbシェルからrun-asと呼ばれるプログラムを使用してアプリケーションのプライベートファイルをコピーするapkがデバッグ可能な場合、方法があります。

2
Chris Stratton

ここでは、手順を追って説明します-ほとんどが他の回答の組み合わせから取られています。これは、ロック解除されていないデバイスで機能します。

  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 /実行:./adb

  4. Firefox SQLLite Managerをインストールします: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Firefox SQLLite Managerを開き、上記の手順3のデータベースファイルを開きます。

  6. 楽しい!

2
Andy Cochrane

ルートとしてadbを実行するか、ルート化された電話で使用する必要があります。

Adbをルートとして実行するには、adb rootを使用します

参照: adbの使用時にデータフォルダーへのアクセスが拒否されるのはなぜですか?

1
Malfist

Android 4.4.2では、run-as- and-cat-to-sdcardソリューションは機能しませんでした。よくわかりませんが、run-asツールが新しいsdcard_rおよびsdcard_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にコピーしました(これには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
1
user167019

デバイスにSDカードがありませんでした

同様の問題がある場合は、次のようにしてください。

  adb Shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
1
dsharew
  1. ターミナルを開く
  2. cd <Android_SDK_PATH>(Windowsの場合はcd C:\Users\Willi\AppData\Local\Android\sdk
  3. cd platform-tools
  4. adb Shell(これは、1つのエミュレータのみが実行されている場合にのみ機能します)
  5. cd data/data
  6. su(スーパーユーザー権限を取得)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. sQLステートメントを発行します(important:;で終了します。そうでない場合、ステートメントは発行されず、代わりに新しい行にブレークします。)

注:ディレクトリの内容を一覧表示する必要がある場合は、ls(Linux)またはdir(Windows)を使用します。

0
Willi Mentzel

このアプリを試してください:SQLiteWeb( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb )。データベースを引き出すことなく、データベースへのリモートアクセスを提供します。

有料版では、プライベートデータベース(/ data/data/package-name ...)のルートアクセス権があるか、SQLiteWeb(アプリ内の命令)を使用して接続するコンテンツプロバイダーを実装します。

ただし、無料版を使いたい場合は、外部ストレージにデータベースを作成できます。

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

OSXでは、オートマトンとsqllitebrowserで@Tadasの回答を使用します( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. automatorを開き、新しいワークフローを作成します。

  2. 「シェルスクリプトの実行」アクションを追加します。

  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のデータベースを更新します。

0
Zaster