2012/03/01

Android:SQLiteツールでデータベースを参照する


SQLiteデータベースの中身をグラフィカルに表示するGUIツールは数多くありますが、
SDKに同梱されているSQLiteツールでも接続が可能です。
直接端末上のデータベースに繋げばリアルタイムでデータを更新できますので、
データベースファイルを端末上からpull→編集→push といった手間が省けてテストの際
には非常に便利です。

ただし、この方法でデータベースを更新してもContentObserver等のDB監視クラスは変更
を検知できずonChangedメソッド等が呼ばれないことに注意してください。


●SQLiteデータベースへの接続方法
データベースへ接続するにはadb shellモードで
# sqlite3 <対象のデータベースファイル>
とすれば接続可能です。

実際にブラウザのブックマークデータベースに接続してみます。

C:\android>adb shell
root@android:/ # cd /data/data/com.android.browser/databases
root@android:/data/data/com.android.browser/databases # sqlite3 browser2.db

接続すると下記情報が表示されます。

sqlite3 browser2.db
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

繋いだ先のデータベースファイル名はbrowser2.db
SQLiteのバージョンは3.7.4
.helpでヘルプが見れます。
SQL文の終わりにはちゃんと";(セミコロン)"を付けましょう
とのことです。

SQLiteデータベースに接続されるとプロンプトが下記のように変化します。
sqlite>

sqlite3で指定するデータベースファイル名を、間違って存在しないファイル名を指定した
場合、エラーは返されず新たにデータベースが作成されます。
この状態でSQL発行すると、当然「テーブルが存在しない」と言われますので注意が必要
です。


●SQLiteコマンド
SQLiteなのでSQLiteコマンドが使えます。
下記によく使うコマンドをまとめました。

・データベースとファイル名を表示
sqlite> .databases
.databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /data/data/com.android.browser/databases/browser2.db
1    temp


・テーブル名一覧を取得
データベースに存在するテーブル一覧を取得するにはtablesコマンドを使用します。
sqlite> .tables
.tables
_sync_state            history                thumbnails
_sync_state_metadata   images                 v_accounts
android_metadata       searches               v_omnibox_suggestions
bookmarks              settings               v_sort_bookmarks


・クエリ結果に列名を表示する
何の指定もなしでSQLを実行したときの結果には列名が表示されません。
sqlite> select _id, url from bookmarks;
select _id, url from bookmarks;
1|http://test1/
2|http://test2/
3|http://test3/

列名を表示したい場合はheaderコマンドを実行します。
sqlite> .header on
sqlite> select _id, url from bookmarks;
_id|url
1|http://test1/
2|http://test2/
3|http://test3/


・クエリ結果の出力モードを設定する
何の指定もなしでSQLを実行したときの結果は非常に見づらいですが、出力モードを設定
すれば実行結果がみやすくなります。
指定できるモードには下記があります。
  • csv
  • column
  • html
  • insert
  • line
  • list
  • tabs
  • tcl
いくつか試してみます。
columnモードは列名表示とあわせれば馴染みのあるフォーマットになります。

sqlite> .header on
sqlite> .mode column
sqlite> select _id, url from bookmarks;
select _id, url from bookmarks;
_id         url
----------  -------------
1           http://test1/
2           http://test2/
3           http://test3/

insertモードは結果をINSERT文として出力します。
sqlite> select _id, url from bookmarks;
select _id, url from bookmarks;
INSERT INTO table VALUES(1,'http://test1/');
INSERT INTO table VALUES(2,'http://test2/');
INSERT INTO table VALUES(3,'http://test3/');


・null値の表示形式を設定する
デフォルトではnullは空白で表示されるため、データが空白なのかnullなのか区別がつき
ません。
nullを別の文字に置き換えたい場合はnullvalueコマンドが使えます。
sqlite> .nullvalue <NULL>
sqlite> select _id, url from bookmarks;
select _id, url from bookmarks;
_id         url
----------  ----------
1           <NULL>
2           http://test2/
3           http://test3/


・実行結果の出力先を変更する
実行結果の出力先をコマンドライン画面ではなくファイルに出力することができます。
sqlite> .output out.txt


・コマンドラインを終了する
exitコマンドでコマンドラインを終了できます。
sqlite> .exit


・フィールド幅を設定する
出力するフィールドの幅を調整したい場合はwidthコマンドが使えます。
widthコマンドに複数の引数を渡すことで複数のフィールド幅を設定することも可能です。
sqlite> .width 10 20
sqlite> select _id, url from bookmarks;
select _id, url from bookmarks;
_id         url
----------  --------------------
1           <NULL>
2           http://test2/
3           http://test3/


●PRAGMAコマンド
PRAGMAコマンドはデータベースの動作設定や内部データの取得に使用します。
Android開発で有用なコマンドを抜粋します。

・データベースの文字コードを取得する
sqlite> PRAGMA encoding;
PRAGMA encoding;
encoding
----------
UTF-8


・テーブル情報を取得する
sqlite> PRAGMA table_info(bookmarks);
PRAGMA table_info(bookmarks);
cid         name                  type        notnull     dflt_value  pk
----------  --------------------  ----------  ----------  ----------  ----------
0           _id                   INTEGER     0           <NULL>      1
1           title                 TEXT        0           <NULL>      0
2           url                   TEXT        0           <NULL>      0
...


・ジャーナルファイルの使用方法を取得する
詳しくは→http://yuki312.blogspot.com/2012/02/androidsqlite.html
sqlite> PRAGMA journal_mode;
PRAGMA journal_mode;
journal_mo
----------
truncate


・ページサイズを取得する
単位はバイトです。
sqlite> PRAGMA page_size;
PRAGMA page_size;
page_size
----------
1024


・ユーザバージョンを指定する
Androidのデータベースバージョンは、このユーザバージョンで管理されます。
sqlite> PRAGMA user_version;
PRAGMA user_version;
user_versi
----------
32


SQLコマンドは割愛します。

以上です。