SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

速習! Androidアプリケーション開発

Androidアプリでのデータベース基礎
~速習! Androidアプリケーション開発(4)~

第4回 データベースの利用

  • X ポスト
  • このエントリーをはてなブックマークに追加

データベースアクセスクラスの作成

 既にソースコード上には登場していますが、データベースへのアクセスはSQLiteDatabaseクラスを利用して行います。

 SQLiteDatabaseは、先ほど作成したDatabaseOpenHelperからgetReadableDatabase()もしくはgetWritableDatabase()で取得します。名前のとおり、それぞれ読み込みと更新で使い分けます。

 SQLiteDatabaseにはinsert()update()query()といったメソッドがあるので、あまり迷う事なく利用できると思います。

BizCardDao.java
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"」という名前にする必要があります。

ListViewにデータをバインドする際の一例
// データベースのオープン
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);

まとめ

 今回でデータベースの準備ができたので、次回からは本格的にアクティビティの実装に入ります。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
速習! Androidアプリケーション開発連載記事一覧

もっと読む

この記事の著者

横井 朗(ヨコイ アキラ)

株式会社ビーブレイクシステムズにて業務システムのパッケージソフト(MA-EYES)の製品開発から導入までを手掛けるとともに、オープンソースソフトウェア(ExCella)の開発リーダも務める。オープンソース関連について多くの執筆経験を持つ。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4814 2010/01/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング