データベースの作成
それではデータベースとスキーマを作成していきます。
まず、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でファイルを開いた状態です。
![データベースファイルをPupSQLiteで開くとこのように表示される](http://cz-cdn.shoeisha.jp/static/images/article/4814/PupSQLite.gif)