androidがsqliteをネイティブサポートしているのは良いのだが、テーブルの生成から何から全てのデータベース操作をAndroidのプログラムでやろうとすると非常に面倒くさい。そこで、sqliteが普通に扱えるLinuxでデータベースの準備をして、そのデータベースファイルをAndroidに送って使うことを考える。
テスト用データベースの生成
SQLiteOpenHelperクラスの派生クラスの、onCreateメソッドを下記のように定義する。onCreateメソッドはopenメソッドを呼べばその中から呼ばれる。onCreateじゃなくても、SQL文が呼ばれればOK。
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"CREATE TABLE testTable ("
+ "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "MEMO TEXT NOT NULL,"
+ "COL_LASTUPDATE TEXT NOT NULL);");
}
Androidで生成したDBファイルを取り出す
context.getDatabasePathメソッドでDBファイルの保存先は調べられる。今回の例では/data/data/com.example.androidtest/databases/myLog.dbで、これをadb shellを使ってそのファイルを外部SDカードにコピーする。
$ adb shell
shell@SC-03E:/ su
su
root@SC-03E:/ # cd /data/data/com.example.androidtest/databases
cd /data/data/com.example.androiddatabases
sh: cd: /data/data/com.example.androiddatabases: No such file or directory
2|root@SC-03E:/ # cd /data/data/com.example.androidtest/databases
cd /data/data/com.example.androidtest/databases
root@SC-03E:/data/data/com.example.androidtest/databases # ls
ls
myLog.db
myLog.db-journal
root@SC-03E:/data/data/com.example.androidtest/databases # cp my
root@SC-03E:/data/data/com.example.androidtest/databases # ls
ls
myLog.db
myLog.db-journal
root@SC-03E:/data/data/com.example.androidtest/databases # cp myLog.db /storage/ extSdCard/Temp/
Androidから取り出したDBファイルを調べる
Linuxのsqlite3コマンドでAndroidから取り出したDBファイルを開いてみる。.tablesコマンドでテーブル一覧を見てみると、上記SQL文で作ったtestTableとandroid_metadataというAndroid管理のテーブルがあるのがわかる。
$ sqlite3 myLog.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .tables
android_metadata testTable
.schemaコマンドでtestTableを調べると、間違いなく上記SQL文によって作られたものだ。
sqlite> .schema testTable
CREATE TABLE testTable (ID INTEGER PRIMARY KEY AUTOINCREMENT,MEMO TEXT NOT NULL,COL_LASTUPDATE TEXT NOT NULL);
同様にandroid_metadataテーブルを調べるとlocaleというカラムがあるのみ。中身は日本のロケールを表す文字列ja_JPが入っているのみだ。
sqlite> .schema android_metadata
CREATE TABLE android_metadata (locale TEXT);
sqlite> select * from android_metadata;
ja_JP
Androidが管理するテーブル
Android外部でDBファイルを作る場合は、android_metadataテーブルを作ってロケール文字列を入れておくのが無難そうだ。
というわけで、次回は逆に外部(Linux Box)で作ったDBファイルをAndroidに取り込んで使えるか確認します。
コメント