全然どうでもいいんだが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 Listlist() { 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の記事