19

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 
4

11 に答える 11

36

次の解決策は、デバッグ可能なアプリでのみ機能します。一部のデバイス、特に Jelly Bean では run-as コマンドが機能しないため、すべてのデバイスでうまく機能しない可能性があります。

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

    adb shell run-as [パッケージ] chmod 777 /data/data/[パッケージ]/databases/

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

    adb shell run-as [パッケージ] cp /data/data/[パッケージ]/databases/[db_file_name] /sdcard/

    adb pull /sdcard/[db_file_name]

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

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

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

  • あなたはWindowsで作業しています
  • デバイスが接続され、「adb devices」の下に表示されます
于 2015-03-25T14:01:48.327 に答える
30

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

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 デバイスで直接外部メモリからデータベースを表示できます。

于 2013-07-26T14:08:00.587 に答える
10

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

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 デバイスで完全に機能しています。

于 2013-12-27T04:37:12.913 に答える
3

facebook が開発した stetho Library を使ってみてください。Web ブラウザ経由でデータベースを表示できますhttps://facebook.github.io/stetho/

于 2016-02-16T12:11:56.820 に答える
3

このようなことをしなければならなかっただけで、それを行う方法がありますが、それは苦痛です。ファイルをアプリケーションのユーザー アカウントとして 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
于 2014-05-28T18:21:01.967 に答える
0
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/

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

于 2016-06-20T14:54:37.563 に答える
-2

ルート化されていないデバイスの /data フォルダーにアクセスできません

それを行う方法はありません。Android には優れたセキュリティ メカニズムがあります。アプリのみが独自のファイルにアクセスできます。

于 2013-07-26T14:09:24.830 に答える
-2

ルート化されていない電話からはできません。/data ディレクトリにアクセスできないため、(2) のようにデータベースをコピーしたり、sqlite アプリを使用したりすることはできません。デバッグが必要な場合は、シミュレーターを使用するか、アプリからクエリを実行してデータベースを検査します。

于 2013-07-26T14:09:29.747 に答える