全然どうでもいいんだがDAOって響きなんだかマヌケなかんじがしません?だお。
/src/com.example.bizcart/db/BizCardDao.java
public class BizCardDao {
//インスタンス変数
private DatabaseOpenHelper helper = null;
//コンストラクタ
public BizCardDao(Context context) {
helper = new DatabaseOpenHelper(context);
}
//レコードを保存する
public BizCard save(BizCard bizCard){
SQLiteDatabase db = helper.getWritableDatabase();
BizCard result = null;
try {
//保存するContentValuesオブジェクトを作成
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();
//保存
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;
}
// 該当IDのレコードを取得
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;
}
// 全レコードを取得
public List list() {
SQLiteDatabase db = helper.getReadableDatabase();
List bizCardList;
try {
Cursor cursor = db.query( BizCard.TABLE_NAME, null, null, null, null, null, BizCard.COLUMN_ID);
bizCardList = new ArrayList ();
cursor.moveToFirst();
while( !cursor.isAfterLast()){
bizCardList.add( getBizCard( cursor));
cursor.moveToNext();
}
} finally {
db.close();
}
return bizCardList;
}
// 該当のレコードを削除
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();
}
}
// カーソルからオブジェクトへの変換を行うサブルーチン
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;
}
}
見知らぬコードが一気に増えました。順に見てみます。
save()でレコードを保存します。
SQLiteOpenHelperからSQLiteDatabaseオブジェクトを得るメソッドはgetReadableDatabase()とgetWritableDatabase()ふたつがありますが、前者は読み取り専用、後者は読み書きどちらも可能ということらしいです。
万一のことを考えて保存するメソッド以外はgetReadableDatabase()を呼んどけばいいということですかね。
ContentValuesはDBに保存する値を突っ込んでおく連想配列みたいなクラスです。
ContentValues.put(key, value)でキーと値のペアを注ぎ込んで、最後にinsert()なりupdate()なりの引数として渡します。
保存するメソッドはこんな形。
SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)
SQLiteDatabase.update(String table, ContentValues values, String whereClause, String whereArgs[])
nullColumnHackって何だ?
updateの第三引数はwhere句、第四引数はバインドする値の配列です。
PHP的に言うとupdate($table, $values, 'hoge = ? AND fuga = ?', array( 'foo', 'bar' ) )ですかね。
保存に成功した場合は、引数のBizCardは使用せず保存したデータをload()で読み込んでいます。
そのload()は引数のIDのレコードを取得します。
SQLiteDatabase.query(String table, String columns[], String selection, String selectionArgs[], String groupBy, String having, String orderBy)
第二引数は取得するカラム名を並べるようです。
nullにすると全カラム取ってきてくれるみたい。
返り値はContentValuesでいいのに何故かCursorとかいう形で返ってくるので、BizCard形式に戻して返します。
このgetBizCard()がCursor.getString(1)とか書いてあるんですが今時カラム名じゃなくて番号かよ。こええよ。
Cursor.getColumn(BizCard.COLUMN_PERSON_NAME)とか無いの?
list()は保存されている全エントリをBizCardのListに入れて返します。
中身はload()とほぼ同じです。
while文中にあるCursor.isAfterLast()は最終行よりさらに先にいるかという意味のようです。
whileが最終行までくるくると回り続け、結果として全ての行を取得して返します。
これ、limitが設定されていないのでデータが増えていくと危険なことになりそうです。
delete()はそのまま削除の意味です。
サンプルでは引数がBizCardですがint BizCard.COLUMN_IDで十分な気が。
こんなかんじでデータベースを操作するクラスが完成しました。
Androidの記事