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


98

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

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

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

回答:


142

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

APIレベル8(Android 2.2)以降、アプリケーションをデバッグ可能としてビルドする場合、シェル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では正しく動作しません。そこでは前者の方法を使用します。


1
@MikeIsrael念のため、アプリでSQLCipherを使用していませんか?そうでない場合は、データベースが正しくダウンロードされたかどうかを大まかに確認するために、ビューア(できれば16進ビューア)でDBファイルを開き、SQLite format 3文字列で始まるかどうかを確認します。また、正しいsqliteバージョンであることを確認してください(つまり、sqlite2実行可能ファイルでsqlite3データベースを開こうとしているわけではありません)。また、他のSQLiteクライアント(SQLiteStudioなど)を試すこともできます。それが役に立てば幸い。
Idolon

1
ワンライナーで困っています。シェルでコマンドを実行すると問題なく動作しますが、1つのライナーを挿入すると、指定したパスが見つかりません。
Rev Tyler

2
パッケージ<my package>は不明です...理由は誰でも知っています。デバッグボタンを押して、スタジオからインストールしました。
Nathan Schwermann、2014年

4
Android Lollipopで私が取得していますpermission denied
Muhammad Babar

1
2つのテーブルとそれぞれに数十行のデータベースをプルし、各テーブルで完全選択クエリを実行しました。1つは問題なく動作し、もう1つはファイルのデータエラーを報告しました。現時点での私の推測は、Androidとローカルシェルの間のエンコーディングの不一致です。
メイソン

23

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

最初のコマンドはデータベースのゼロバイトコピーを作成するため、スクリプトを調整しました:gist.github.com/romulof/6af8a8919660f395f975
romulof

14

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

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

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

それは私をたくさん助けてくれました。

ここで1分のデモを表示できます。http//youtu.be/P5vpaGoBlBY


11

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

私が最近発見した(そして最も好む)ツールは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

すべてのブラウザで動作し、データベーステーブルと共有設定を検査できます。

ここに画像の説明を入力してください

デフォルトおよびGenymotionエミュレータでも動作します。


以前使用したツールはstethoです。

欠点:少しのコードを追加する必要があり、Chromeブラウザーにバインドされます。

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



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"

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


3

私は単にしました:

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

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


2

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


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. 楽しい!


2

Android Studio 4.1 Android SQLiteデータベースを表示/編集する新機能が追加されました。

ここに画像の説明を入力してください

データベースインスペクターを開く方法

Android Studioでデータベースインスペクターを開くにはView > Tool Windows > Database Inspector、メニューバーから選択する必要があります。

また、APIレベル26以上を実行しているデバイスでアプリを実行する必要があります。

このツールを使用すると、次のことができます

  • データベースをクエリする

  • データベースを変更してデバッグする

ここに画像の説明を入力してください


2

新しいAndroid Studio 4.1には、新しいDatabase Inspectorがあります。

https://developer.android.com/studio/preview/features/images/database-inspector.gif

メニューバーから次のオプションを選択しView > Tool Windows > Database Inspectorて開くことができます。詳細な手順については、このブログをご覧ください。

別の方法は、これにステトを使用することです。依存関係を追加すると、デバイスが接続されているときにChrome DevTools(chrome:// inspect)を使用してデータベースを確認できます。


1

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

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

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


私はこれを試しました。しかし、「adbはプロダクションビルドではrootとして実行できません」
Primal Pappachan、2011

デバッグモードで実行する必要があります。
Malfist、2011

これを参照してください:mydroidworld.com/forums/android-hacks/…エミュレーターではなく電話で実行している場合は、ルート化する必要があります。
Malfist、2011

アプリケーションをデバッグモードで実行し、上記の手順も試しました。動作しません。
Primal Pappachan 2011

これは、エミュレータまたはルート権限を取得されたデバイスでのみ機能します。
スロット、2015年

1

run-asAndroid 4.4.2では、-and-cat-to-sdcardソリューションは私にとってはうまくいきませんでした。よくわかりませんが、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はJavaland にコピーしました(これには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
より簡単な解決策があります。sqliteファイルをchmod 777してからrun-asを終了すると、通常の使用方法として/ sdcardにコピーできます。
zeix 2014

1

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

だから最初の解決策は私にはうまくいきませんでした。

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

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

/sdcard必ずしもSDカードである必要はありません。私の電話では、物理SDカードが存在しないときに内部ストレージをポイントします。
DearVolt 2017

0

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

有料版では、プライベートデータベース(/ data / data / package-name ...)へのrootアクセス権を持っているか、SQLiteWeb(アプリ内の説明)を使用して接続するコンテンツプロバイダーを実装しています

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

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

0

OSXでは、@ Tadas回答をオートマトンとsqllitebrowserで使用します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
  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ステートメントを発行します(重要:それらを;で終了します。そうでない場合、ステートメントは発行されず、代わりに新しい行に分割されます)。

注:ディレクトリーの内容をリストする必要がある場合は、ls(Linux)またはdir(Windows)を使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.