データベースアクセスクラスの作成
既にソースコード上には登場していますが、データベースへのアクセスは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);
まとめ
今回でデータベースの準備ができたので、次回からは本格的にアクティビティの実装に入ります。
