現在、Android用のWiFiアプリケーションの開発に取り組んでいます。デバイス上のデータベースにアクセスしようとすると問題が発生します。エミュレータでのWiFiのサポートがないため、エミュレータでのデバッグは機能しません。を使用してデバイスからデータベースファイルを引き出してみました
adb pull data/data/package-name/databases/database-name
しかし、「Permission denied。」というエラーが表示されます。この回答で Android:データベースファイルはどこに保存されますか? 、Commonswareはデバッグモードで実行してデータベースファイルをプルすることを提案しました。しかし、それも機能しません。デバイスをルート化せずにデータベースをデバッグする方法に関するヘルプをいただければ幸いです。
別の答え から繰り返します。
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では正しく機能しません。そこで前者の方法を使用してください。
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
Androidアプリデータベースを表示および管理する最良の方法は、このライブラリを使用することです https://github.com/sanathp/DatabaseManager_For_Android
このライブラリを使用すると、アプリ自体からアプリのSQLiteデータベースを管理できます。アプリデータベースのテーブルを表示、更新、削除、テーブルに行を挿入できます。アプリのすべて。
単一のJavaアクティビティファイル、Javaファイルをソースフォルダーに追加します。開発が完了したら、srcフォルダーからJavaファイルを削除します。 。
それは私を大いに助けてくれました。
ここで1分間のデモを見ることができます: http://youtu.be/P5vpaGoBlBY
とはいえ、それは古い質問であり、今でも関連性があり、現状の答えに値すると思います。利用可能なツールがあり、データベースを直接検査できます(デバイスやエミュレーターからデータベースをプルする必要はありません)。
このツールは、私が最近発見した(そして最も好意的な) 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ブラウザーにバインドされます。
利点:ネットワークトラフィックを検査するオプションもあります。
あなたが取得する場合
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"
二重引用符に注意してください!
私のアプリケーションでは、データベースをSDカードにエクスポートします。データベースがSDカードに保存されると、デバイスをコンピューターに接続することでデータベースにアクセスできます。
この投稿を見てください: AndroidでのSDCardへのデータベースバックアップの作成
私は単にやった:
$ adb Shell
shell@Android:/ $ run-as myapp.package.name sh
Shell@Android:/data/data/myapp.package.name $
その後、sqliteデータベースまたは適切な権限でシェルから実行したいことをデバッグできます。
(非ルート)adbシェルからrun-asと呼ばれるプログラムを使用してアプリケーションのプライベートファイルをコピーするapkがデバッグ可能な場合、方法があります。
ここでは、手順を追って説明します-ほとんどが他の回答の組み合わせから取られています。これは、ロック解除されていないデバイスで機能します。
デバイスを接続し、デバッグモードでアプリケーションを起動します。
データベースファイルをアプリケーションフォルダーからsdカードにコピーします。実行:
./adb -d Shell 'run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'
データベースファイルをマシンにプルします。実行:
./adb pull/sdcard /実行:./adb
Firefox SQLLite Managerをインストールします: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
Firefox SQLLite Managerを開き、上記の手順3のデータベースファイルを開きます。
楽しい!
ルートとしてadbを実行するか、ルート化された電話で使用する必要があります。
Adbをルートとして実行するには、adb root
を使用します
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
同様の問題がある場合は、次のようにしてください。
adb Shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
adb pull /data/data/package/databases/yourdb.sqlite
cd <Android_SDK_PATH>
(Windowsの場合はcd C:\Users\Willi\AppData\Local\Android\sdk
)cd platform-tools
adb Shell
(これは、1つのエミュレータのみが実行されている場合にのみ機能します)cd data/data
su
(スーパーユーザー権限を取得)cd <PACKAGE_NAME>/databases
sqlite3 <DB_NAME>
;
で終了します。そうでない場合、ステートメントは発行されず、代わりに新しい行にブレークします。)注:ディレクトリの内容を一覧表示する必要がある場合は、ls
(Linux)またはdir
(Windows)を使用します。
このアプリを試してください: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);
OSXでは、オートマトンとsqllitebrowserで@Tadasの回答を使用します( https://github.com/sqlitebrowser/sqlitebrowser ):
automatorを開き、新しいワークフローを作成します。
「シェルスクリプトの実行」アクションを追加します。
これを貼り付けます:
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。名前
[実行]をクリックして、sqlitebrowserのデータベースを更新します。