oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

開発中にAndroidアプリでSQLiteに格納したデータをデータファイルコピーせずに確認する方法

【追記】
このブログ書いた後に改めてググったら普通にこの方法見つかるね。俺が見逃していただけですな・・・。

                                                                                                                                    • -

表題のままで、開発中にAndroid アプリで定義したSQLiteスキーマをちゃんと確認したいとか、中にどんなデータが入ったかを確認したかったが、ググっても出てくるのが「SQLite3のファイルをローカルにコピーしてきて、それを見る」ばっかりだったので、面倒くせーと思ったらファイルコピーしなくても出来た。
環境はMac + Android Studio + Genymotion上のNexus端末なので、実機ではRoot権限を取らないと多分この方法はムリ。試しにやったらroot権限無くて対象のディレクトリに入れないので出来なかった。

方法としては

  • adb shellで端末に入る
  • cd /data/data/{アプリ名}/databases/してディレクトリを移動。
  • 中にあるSQLiteデータファイルを指定してSQLite3コマンドラインインターフェイスを起動。
  • 後は普通にクエリを実行して確認する
例えばexample-appという名前のアプリでexample-dbというテーブルを作成していた場合はexample-dbというデータファイルがあると思うので
# adb shell (PATH通っていないとかは知らん)
# cd /data/data/example-app/databases/
# sqlite3 ./exampl-db

SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
で中に入れるので、
sqlite> .databases  
でdatabaseの一覧を見たり
sqlite> .schema example-db
でスキーマを確認したり
sqlite> select * from example-db;
で普通にSELECT文を実行出来る。

という流れになる。Android StudioのTerminalからadb shellを実行すれば良いので確認が楽になった。別に普通のTerminalからでも出来る。

ただ、以前までは普通にadb shellで端末に入れたのに実機のNexus7に一度繋げてから、Genymotionの端末に入ろうとadbコマンド実行すると

$ adb shell
adb server is out of date.  killing...
cannot bind 'tcp:5037'
ADB server didn't ACK
* failed to start daemon *
error: 

とかで入れなくて、これがAndroidの洗礼か・・・誰か助けて・・・。もちろんこの直前にはAndroidStudioからアプリを端末にインストール出来ている。

なので、こういう時はGenymotionを使って端末起動した場合、ps auxwwとかで確認するとそもそもshellで接続しているので

こんな感じ
 /Applications/Genymotion.app/Contents/MacOS/player.app/Contents/MacOS/tools/adb -s 192.168.56.101:5555 shell

このコマンドをコピペすると中に入れる。