Android用sqliteデータベースを外部で作成する-その1

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に取り込んで使えるか確認します。

コメント