忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/03/29 10:25 |
Android2.2 名刺管理アプリケーションを作ってみる4日目その3
今度は前回作ったデータベースハンドラを使って具体的にデータの操作を行うクラスを作成します。
全然どうでもいいんだが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の記事
 

PR


2010/08/06 22:41 | Comments(0) | TrackBack() | Android

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2010/08/08 | HOME | ゲームレビュー:CHAOS;HEAD らぶChu☆Chu!>>
忍者ブログ[PR]