このページを正しく表示するにはJavascriptを有効にしてください。
Android端末の開発中データベース(SQlite)を見る方法
実機でAndroidアプリの開発中、
アプリ内のDB(SQlite)の構造・データがどうなってるのか
を参照する方法です。
SQLiteのデータはアプリごとに
/data/data/{PackageName}/database/
にフォルダが作られ、ここにSQLiteのデータベースファイルが置かれます。
ただルートを取っていない実機端末では普通にadb shellで入っても
「権限がない」と怒られてしまいます。
デバッグの為にわざわざroot奪取するのもあれだし…、
と悩んでいたところ解決方法が見つかりましたので紹介いたします。
[Debugging sqlite database on the device ](http://stackoverflow.com/questions/6928849/debugging-sqlite-database-on-the-device)
解決方法はこちら。
一般のshellユーザーが権限が無いだけであって、
アプリユーザー(アプリ自身)にとってはDBを見る権限があるので
run-asというコマンドを使ってユーザーを変更すれば見れるみたいです。
こんなコマンドがあるなんて知りませんでした。
Linuxで言うところのsuコマンドみたいなものですね。
これを使って、参照したいDatabaseを持つアプリになりすまし、
データベースのパスまで辿ることができます。
ただ、このユーザーで参照出来てもあまりメリットはないので
(sqlite3コマンドが実機だと動かない(パスが通ってない?))
だれでも見れるSD直下などにコピーし、そこから一般ユーザーでも
アクセスできるようにするのがrun-asでのメイン作業となります。
で、SDなどにコピーが完了すればこっちのものです。
アプリユーザーをexitで抜け、あとは焼くなり煮るなり好きなようにします。
SDをマウントしてみてもいいのですが、マウントだと接続が切れたりするので、
「adb pull」というコマンドを利用するのが便利です。
```
adb pull (パス名 /sdcard/output.dbなど)
```
で、Androidの指定したパスからホストOSのカレントディレクトリに落とせます。
便利なので覚えておいて損はないコマンドです。
TAB補完が効かないのでパス把握してないと辛いですが。
注意としては、この方法を使えばどんなアプリのデータベースも
見放題、書き放題という訳ではないことです。
デバッグのAPK(つまりEclipseからパッケージ化せずに入れたアプリ)しか
run-asを用いて見ることが出来ないそうです。
なので自分で作ってるアプリに関しては問題ないですが、
他人のアプリを不正に操作しよう!みたいなのはちゃんとブロックされています。
```
adb -d shell "run-as {PackageName} cat /data/data/{PackageName}/databases/XXXX.db > /sdcard/output.db"
adb pull /sdcard/output.db
```
まとめるとこの2行でホストOSのカレントディレクトリにdbを落としてこれます。
※ {PackageName}とXXXX.dbは適宜書き替えてください。
落としてきたDBは「sqlite3 output.db」したり
PupSQLite .NET Framework4
みたいなソフトをつかったりして中身を調べてください。
試してませんが、逆の手順を辿ればデータベースを書き換えて戻す
みたいなのも出来るはずです。
DBが覗けるようになると開発やデバッグがはかどりますね。