![[Android]実機のSQLiteへアクセスできないときの暫定回避策](https://devio2023-media.developers.io/wp-content/uploads/2011/11/Android.png)
[Android]実機のSQLiteへアクセスできないときの暫定回避策
実機のSQLiteにアクセス
先日、Androidアプリの動作確認を実機(Galaxy Nexus)で行いました。
昔は問題なくadb shellで中にはいってsqlite3コマンドで確認できた気がしてたんですが、
DBファイルがある場所へ移動してファイルを確認しようとしたらpermission deniedだし、
そもそもsqlite3コマンド自体が使えないという状況でした。
rootとってsqliteを移植してる人もいましたが、今回はデータベースファイルの中身を確認するのが目的だったので、
データベースをPCにもってくる方法についての備忘録的tipsです。
もっとちゃんとした回避策があるような気がしなくもないですが。誰か知ってたら教えてください。
環境
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- 実機 : Galaxy Nexus
- Android OS : 4.1.1
Android SDKの設定をして、adbコマンドは使える状況にしておきましょう。
アプリを実行してadbを実行
まずはEclipseでAndroidアプリを作成し、実機上で実行します。
SQLiteの内容を取得したい時に、adb shellでシェルを起動します。
この状態では、DBファイルは権限がないのでアクセスすることができません。
%adb shell shell@android:/ $ ls /data/data/<アプリのパッケージ>/databases opendir failed, Permission denied
run-asコマンドで、パッケージ名を指定し、そのアプリのユーザーに切り替えます。
こうすることで、アプリのDBファイルにアクセスできます。
※AndroidManifest.xmlでapplicationタグ内で「android:debuggable="true"」となっていること
shell@android:/ $ run-as <アプリのパッケージ>
あとは/data/data/<パッケージ名>/databases/
そのdbファイルの権限をchmodで変更するか、外部からアクセスできる場所へコピーすればOKです。
とりあえずsdcardへコピーしてみました。
shell@android:/ $ cat /data/data/<パッケージ名>/databases/<dbファイル名> > /sdcard/my.db
最後にPCからadb pullコマンドを使用してファイルを取得しましょう。
取得したファイルは、PCのsqliteやSQLite-Managerとかのツールで確認することができます。
% adb pull /sdcard/my.db /path/my/pc/my.db
これでとりあえずDBの中身は見れました。でも、もっと簡単な方法があるような気がする。。