データベースの作成
それではデータベースとスキーマを作成していきます。
まず、SQLiteOpenHelperを継承してDatabaseOpenHelperクラスを作成します。SQLiteOpenHelperのコントラクタを呼ぶとデータベースの存在チェックが行われ、存在しない場合はデータベース生成後にonCreate()が呼び出されます。存在する場合はスキーマのバージョンのチェックが行われ、バージョンが変更されているとonUpgrade()が呼び出されます。
データベースを作り直したい場合は、アプリケーションをいったんアンインストールし、再度実行します。
スキーマの生成、データベースの操作は他のRDBMSと同様、SQLで行います。onCreate()で、先ほど作成したBizCardの定数を参照する形でcreate table文を実行します。また、今後作業を進めやすいように初期データの投入もしておきましょう。
package sample.bizcard.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* データベース処理クラス
*/
public class DatabaseOpenHelper extends SQLiteOpenHelper {
// データベース名の定数
private static final String DB_NAME = "BIZ_CARD";
/**
* 初期投入サンプルデータ
*/
private String[][] datas = new String[][]{
{"光度 人", "××商事", "開発部", "部長","141-0031", "品川区西五反田2-19-3", "090-1111-1111", "03-1111-1111", "code@shoji.co.jp"},
{"高度 仁", "○○コミュニケーションズ", "開発部", "課長","141-0032", "品川区大崎1-2-1", "090-2222-2222", "03-2222-2222", "code@comunications.co.jp"},
{"光度 陣", "×○システムズ", "開発部", null,"153-0043", "目黒区東山1-2-1", "090-3333-3333", "03-3333-3333", "code@systems.co.jp"},
{"荒土 尋", "○×工務店", "開発部", null,"160-0014", "新宿区内藤町11-4", "090-4444-4444", "03-4444-4444", "code@koumuten.co.jp"}
};
/**
* コンストラクタ
*/
public DatabaseOpenHelper(Context context) {
// 指定したデータベース名が存在しない場合は、新たに作成されonCreate()が呼ばれる
// バージョンを変更するとonUpgrade()が呼ばれる
super(context, DB_NAME, null, 1);
}
/**
* データベースの生成に呼び出されるので、 スキーマの生成を行う
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.beginTransaction();
try{
// テーブルの生成
StringBuilder createSql = new StringBuilder();
createSql.append("create table " + BizCard.TABLE_NAME + " (");
createSql.append(BizCard.COLUMN_ID + " integer primary key autoincrement not null,");
createSql.append(BizCard.COLUMN_PERSON_NAME + " text not null,");
createSql.append(BizCard.COLUMN_COMPANY_NAME + " text,");
createSql.append(BizCard.COLUMN_ORGANIZATION_NAME + " text,");
createSql.append(BizCard.COLUMN_POSITION_NAME + " text,");
createSql.append(BizCard.COLUMN_ZIP_CODE + " text,");
createSql.append(BizCard.COLUMN_ADDRESS + " text,");
createSql.append(BizCard.COLUMN_TEL1 + " text,");
createSql.append(BizCard.COLUMN_TEL2 + " text,");
createSql.append(BizCard.COLUMN_MAIL + " text");
createSql.append(")");
db.execSQL( createSql.toString());
// サンプルデータの投入
for( String[] data: datas){
ContentValues values = new ContentValues();
values.put(BizCard.COLUMN_PERSON_NAME, data[ 0]);
values.put(BizCard.COLUMN_COMPANY_NAME, data[ 1]);
values.put(BizCard.COLUMN_ORGANIZATION_NAME, data[ 2]);
values.put(BizCard.COLUMN_POSITION_NAME, data[ 3]);
values.put(BizCard.COLUMN_ZIP_CODE, data[ 4]);
values.put(BizCard.COLUMN_ADDRESS, data[ 5]);
values.put(BizCard.COLUMN_TEL1, data[ 6]);
values.put(BizCard.COLUMN_TEL2, data[ 7]);
values.put(BizCard.COLUMN_MAIL, data[ 8]);
db.insert(BizCard.TABLE_NAME, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
}
/**
* データベースの更新
*
* 親クラスのコンストラクタに渡すversionを変更したときに呼び出される
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースの更新
}
}
これでデータベースの準備は完了です。なお、現在のデータベースの状態はコマンドラインツール(adb.exe)から確認できます(エミュレータを起動しておく必要があります)。
%ANDROID_SDK_HOME%tools>adb.exe shell ←Shellを起動 # cd /data/data/sample.bizcard/databases/ ←データベースファイルのディレクトリへ移動 # sqlite3 BIZ_CARD ←データベースへ接続 sqlite> select * from biz_card; ←任意のSQLを実行 1|蜈牙コヲ縲莠コ|テ療怜膚莠弓髢狗匱驛ィ|驛ィ髟キ|141-0031|蜩∝キ晏玄隘ソ莠泌渚逕ー2-19-3| 090-1111-1111|03-1111-1111|code@shoji.co.jp 2|鬮伜コヲ縲莉-笳銀雷繧ウ繝溘Η繝九こ繝シ繧キ繝ァ繝ウ繧コ|髢狗匱驛ィ|隱イ髟キ|141-0032|蜩 ∝キ晏玄螟ァ蟠・-2-1|090-2222-2222|03-2222-2222|code@comunications.co.jp 3|蜈牙コヲ縲髯」|テ冷雷繧キ繧ケ繝・Β繧コ|髢狗匱驛ィ||153-0043|逶ョ鮟貞玄譚ア螻ア1-2-1|090 -3333-3333|03-3333-3333|code@systems.co.jp 4|闕貞悄縲蟆弓笳凝怜キ・蜍吝コ慾髢狗匱驛ィ||160-0014|譁ー螳ソ蛹コ蜀・陸逕コ11-4|090-444 4-4444|03-4444-4444|code@koumuten.co.jp sqlite> .quit ←データベースとの接続を終了 # exit ←Shellの終了
Tips:データベースファイルのエクスポート
コマンドラインツールでは確認し辛い場合、次のような手順でデータベースファイルをエミュレータからエクスポートし、任意のSQLite対応のツールに読み込ませることもできます。
[Window]-[Show View]-[Other]-[File Explorer]でFile Explorerビューを表示します。
ツリーから対象のファイル(data/data/sample.bizcard/databases/BIZ_CARD)を選択した状態で[Pull a file from the device](下図中[1])を実行すると、指定したディレクトリにファイルがコピーされます。
コピーしたファイルは、好きなツールで読み込むことができます。下記は、PupSQLiteでファイルを開いた状態です。


