web-dev-qa-db-ja.com

ルート権限を取得していないAndroidデバイスでデータベースを確認する方法

Sqllite3データベースを使用して値を保存するアプリを開発しています。 Nexus SとNexus 7はどちらもルート化されていないデバイスです。デバッグ目的でアプリのデータベースを取得するにはどうすればよいですか?.

私は試しました(1)私は言及されたすべてのアプローチを試しました ここ

adb Shell
run-as app.package.name \
cp /data/data/package.name/databases/application.sqlite /sdcard/
exit
adb pull /sdcard/application.sqlite ~/

これは、cpが見つからないことを示しています。

(2) http://developer.Android.com/tools/help/adb.html#sqlite

adb -s emulator-5554 Shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit 
18
CodingRat

次のようにして、データベースを外部メモリに書き込むことができます。

private void writeToSD() throws IOException {
    File sd = Environment.getExternalStorageDirectory();

    if (sd.canWrite()) {
        String currentDBPath = DB_NAME;
        String backupDBPath = "backupname.db";
        File currentDB = new File(DB_PATH, currentDBPath);
        File backupDB = new File(sd, backupDBPath);

        if (currentDB.exists()) {
            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
    }
}

どこ DB_NAMEは私のデータベースの名前であり、DB_PATHは次のように定義されます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator;
    }
    else {
        DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/";
    }

そして、次の許可を追加します(これを指摘してくれた@Satheshに感謝します)。

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

データベースへの書き込みがあるときはいつでもこのメソッドを呼び出して、最新のデータベースファイルを外部メモリに置き、そこから表示およびデバッグできるようにします。

次に、 X-Ploreアプリ を使用して、Androidデバイスの外部メモリからデータベースを表示できます。

30
TronicZomB

次のソリューションは、デバッグ可能なアプリでのみ機能します。一部のデバイス、特にジェリ​​ービーンではrun-asコマンドが機能しないため、すべてのデバイスでうまく機能しない可能性があります。

  1. * .batファイルを作成し、次のスクリプトをコピーします

    adb Shell run-as [package] chmod 777/data/data/[package]/databases /

    adb Shell run-as [package] chmod 777/data/data/[package]/databases/[db_file_name]

    adb Shell run-as [package] cp/data/data/[package]/databases/[db_file_name]/sdcard /

    adb pull/sdcard/[db_file_name]

  2. [パッケージ]を目的のアプリケーションパッケージに変更します

  3. [db_file_name]を目的のデータベース名に変更します。batファイルを実行すると、コピーされたデータベースがbatファイルと同じフォルダーに表示されます。

上記のソリューションは、次のことを前提としています。

  • あなたはWindowsで作業しています
  • デバイスが接続され、「adbデバイス」の下に表示されている
36
kmalmur

これは非常にシンプルで簡単な答えです:(Android one:nrootedでテスト済み)

adb -d Shell 
$ run-as my.package.name
$ cp databases/mydatabase.db /sdcard/mydatabase.db
$ exit
$ exit

データベースをデフォルトのadbパスにプルします

adb -d pull /sdcard/mydatabase.db

または、デスクトップなどに.

adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop

以下のコマンドでコピーを削除したい場合があります:

adb -d Shell "rm /sdcard/mydatabase.db"

-dオプションは、複数のエミュレーターがある場合、デフォルトのデバイスを選択します。

9
kolunar

アプリケーションのパスがわからない場合は、これを使用できます。

public void copyAppDbToExternalStorage() throws IOException {
    File sd = Environment.getExternalStorageDirectory();
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    if (sd.canWrite()) {
        File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db"
        if (currentDB.exists()) {
            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
        }
    }
}

または、データベースをパブリックの「ダウンロード」フォルダにコピーする必要がある場合は、これを使用できます。

public void copyAppDbToDownloadFolder() throws IOException {
    File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db"
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db"
    if (currentDB.exists()) {
        FileChannel src = new FileInputStream(currentDB).getChannel();
        FileChannel dst = new FileOutputStream(backupDB).getChannel();
        dst.transferFrom(src, 0, src.size());
        src.close();
        dst.close();
    }
}

これは私のNexus 4デバイスで完全に動作しています。

9
mr.boyfox

私はこのようなことをしなければならなかっただけで、それを行う方法はありますが、それは苦痛です。このファイルをアプリケーションのユーザーアカウントとしてcatし、書き込み可能な場所にパイプする必要があります。これは、4.3.3を実行しているNexus 4で私にとってはうまくいきました。

adb Shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file"
adb pull /mnt/sdcard/your-file
3
Ted Mielczarek

Facebookによって開発されたstethoライブラリを使用してみてください。Webブラウザを介してデータベースを表示できます https://facebook.github.io/stetho/

2
rAm

走った後

adb Shell "run-as your.package.name"

「run-as:Package 'your.package.name' is unknown」というメッセージが表示されたら、エミュレータからデータベースを取得してみてください。ここを参照してください: https://stackoverflow.com/a/44089632/291414

Android Studio 3.0で、[表示]> [ツールウィンドウ]> [デバイスファイルエクスプローラ]をクリックします。/data/data/[package-name]ノードを展開します。

0
CoolMind

これが一番簡単な方法だと思います。この依存関係をGradleファイルに追加します。debugImplementation 'com.amitshekhar.Android:debug-db:1.0.0'

この後、コンソールでアプリケーションを起動すると、次のメッセージが表示されます。D/ DebugDB:Open http://192.168.1.114:808 ブラウザーで

そしてあなたのデータベースがあります。

0
f.trajkovski
adb Shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db"
adb Shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/

Xamarin.formsでは、データベースをファイルに置き換える必要がありました

0
Massimo Alvaro