データベースアクセスクラスの作成
既にソースコード上には登場していますが、データベースへのアクセスはSQLiteDatabaseクラスを利用して行います。
SQLiteDatabaseは、先ほど作成したDatabaseOpenHelperからgetReadableDatabase()
もしくはgetWritableDatabase()
で取得します。名前のとおり、それぞれ読み込みと更新で使い分けます。
SQLiteDatabaseにはinsert()
やupdate()
、query()
といったメソッドがあるので、あまり迷う事なく利用できると思います。
package sample.bizcard.db; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * BizCard用データアクセスクラス */ public class BizCardDao { private DatabaseOpenHelper helper = null; public BizCardDao(Context context) { helper = new DatabaseOpenHelper(context); } /** * BizCardの保存 * rowidがnullの場合はinsert、rowidが!nullの場合はupdate * @param bizCard 保存対象のオブジェクト * @return 保存結果 */ public BizCard save( BizCard bizCard){ SQLiteDatabase db = helper.getWritableDatabase(); BizCard result = null; try { ContentValues values = new ContentValues(); values.put( BizCard.COLUMN_PERSON_NAME, bizCard.getPersonName()); values.put( BizCard.COLUMN_COMPANY_NAME, bizCard.getCompanyName()); values.put( BizCard.COLUMN_ORGANIZATION_NAME, bizCard.getOrganizationName()); values.put( BizCard.COLUMN_POSITION_NAME, bizCard.getPositionName()); values.put( BizCard.COLUMN_ZIP_CODE, bizCard.getZipCode()); values.put( BizCard.COLUMN_ADDRESS, bizCard.getAddress()); values.put( BizCard.COLUMN_TEL1, bizCard.getTel1()); values.put( BizCard.COLUMN_TEL2, bizCard.getTel2()); values.put( BizCard.COLUMN_MAIL, bizCard.getMail()); Long rowId = bizCard.getRowid(); // IDがnullの場合はinsert if( rowId == null){ rowId = db.insert( BizCard.TABLE_NAME, null, values); } else{ db.update( BizCard.TABLE_NAME, values, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( rowId)}); } result = load( rowId); } finally { db.close(); } return result; } /** * レコードの削除 * @param bizCard 削除対象のオブジェクト */ public void delete(BizCard bizCard) { SQLiteDatabase db = helper.getWritableDatabase(); try { db.delete( BizCard.TABLE_NAME, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( bizCard.getRowid())}); } finally { db.close(); } } /** * idでBizCardをロードする * @param rowId PK * @return ロード結果 */ public BizCard load(Long rowId) { SQLiteDatabase db = helper.getReadableDatabase(); BizCard bizCard = null; try { Cursor cursor = db.query( BizCard.TABLE_NAME, null, BizCard.COLUMN_ID + "=?", new String[]{ String.valueOf( rowId)}, null, null, null); cursor.moveToFirst(); bizCard = getBizCard( cursor); } finally { db.close(); } return bizCard; } /** * 一覧を取得する * @return 検索結果 */ public List<BizCard> list() { SQLiteDatabase db = helper.getReadableDatabase(); List<BizCard> bizCardList; try { Cursor cursor = db.query( BizCard.TABLE_NAME, null, null, null, null, null, BizCard.COLUMN_ID); bizCardList = new ArrayList<BizCard>(); cursor.moveToFirst(); while( !cursor.isAfterLast()){ bizCardList.add( getBizCard( cursor)); cursor.moveToNext(); } } finally { db.close(); } return bizCardList; } /** * カーソルからオブジェクトへの変換 * @param cursor カーソル * @return 変換結果 */ private BizCard getBizCard( Cursor cursor){ BizCard bizCard = new BizCard(); bizCard.setRowid( cursor.getLong(0)); bizCard.setPersonName( cursor.getString(1)); bizCard.setCompanyName( cursor.getString(2)); bizCard.setOrganizationName( cursor.getString(3)); bizCard.setPositionName( cursor.getString(4)); bizCard.setZipCode( cursor.getString(5)); bizCard.setAddress( cursor.getString(6)); bizCard.setTel1( cursor.getString(7)); bizCard.setTel2( cursor.getString(8)); bizCard.setMail( cursor.getString(9)); return bizCard; } }
以上でデータベースを利用する準備は完了です。
上記のように、毎回データベースをオープン/クローズするような書き方はパフォーマンス面から好ましくない場合もありますが、今回はシンプルにするためにこのように実装しています。
データバインド
今回のサンプルアプリでは利用していませんが、AndroidにはUI部品とデータベースを接続するためのデータバインドの仕組みがあります。
データベースから取得したデータをListViewにバインドするソースは、次のようになります。なお、Androidのソースでハードコーディングされているため、データバインドを利用するにはキー列を「"_id"
」という名前にする必要があります。
// データベースのオープン DatabaseOpenHelper helper = new DatabaseOpenHelper( this); // カーソルを取得 Cursor cursor = helper.getReadableDatabase().rawQuery("select * from biz_card", null); // カーソルからアダプタを生成 SimpleCursorAdapter adapter2 = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_1, // レイアウト cursor, // カーソル new String[] {BizCard.COLUMN_PERSON_NAME}, // 表示するデータのカラム名 new int[] {android.R.id.text1}); // 表示先のViewのID // リストにアダプタを設定 listView.setAdapter(adapter2);
まとめ
今回でデータベースの準備ができたので、次回からは本格的にアクティビティの実装に入ります。