データベースのデバッグ adb shellでDBの内容を確認する

Last Update: 2014-09-18

アプリでデータベースを利用する場合、動作確認のためにその中身を確認したい時があります。

データベースへの書き込みを行ってみたものの、ちゃんと保存されているのか確認したい・・・よくあると思います。そんな場合に、adb shellを利用します。

adb shell

Androidアプリを開発するなら簡単なadbコマンドは知っておいたほうがいいと思います。ちなみにadb shellで端末やエミュレータにアクセスする手順は必ずしも以下のとおりでなくてもいいです。

まずはAndroid Studioからエミュレータを起動します。起動したらAndroid StudioのTerminalツールウィンドウを開きます。

Terminalツールウィンドウを開く

adb shellと入力すると、端末にログインできます。

データベースは特別な指定をしていない限り、/data/data/パッケージ名/databases/データベースファイル名に作成されています。

この例の場合は/data/data/jp.gcreate.sample.sampledatabase.app/databases/Sample.dbとなっています。

データベースファイルの場所

これがSQLiteのデータベースファイルになるので、ローカルにコピーしてツールを使って確認するなりしましょう。今回は中身を確認するだけなので、そのままターミナルからsqlite3コマンドを使ってみます。

sqlite3コマンド

sqlite3 データベースファイル名でSQLiteコマンドが実行されます。

sqlite3コマンド

このモードではSQLを使っていろいろできます。私が最初戸惑ったのはこんなかんじです。

  • 基本的に全てSQL文であると判断される
  • エンターでコマンドが実行されるわけではない
  • SQL文は最後に`;`つけない限り改行だと判断される
  • SQLiteのシステムコマンドを使いたい場合は最初にドットをつける

とりあえず以下のコマンドを知っていればなんとかなると思います。

  • `.help`コマンドでヘルプが見れます。
  • `.exit`コマンドで脱出できます。
  • `.schema`コマンドで、データベースファイル内のテーブル構造なんかが確認できます。
  • `.tables`コマンドで、データベースファイル内にどんなテーブルがあるか確認できます。
  • `SELECT * from テーブル名;`で、テーブル内のデータを確認できます。`

実際に実行してみると以下の様な感じで確認できます。

sqlite3コマンドでのデータベース内の確認

SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE Sample(_id integer primary key autoincrement , InputText text not null , InputDate text not null );
CREATE TABLE android_metadata (locale TEXT);
sqlite> .tables
Sample            android_metadata
sqlite> SELECT * from Sample;
1|abc|2014/09/10 12:42:22
2|welcome to JAPAN!|2014/09/10 12:42:40
3|this is test|2014/09/10 12:42:50
4|aaa|2014/09/10 12:43:04
sqlite> 

私はドットインストールでSQLiteを勉強しました。AndroidのSQLiteは簡易版なので、使えないプロパティとかもあったりしますが、基本的なところはこれでなんとかなると思います。

実機の場合はうまくいかない

ちなみにこの方法は、実機では使えない手段です。データのパーミッションの関係でファイルを取得することもできず、そもそもsqlite3コマンドが利用できない場合があるからです。

実機をルート化しているとか、デバッグ用のアプリ(AndroidManifest.xmlのdebuggableがtrueになっている)であるとかなら何とかなりますが、基本的にこの方法はエミュレータを前提とした話です。