前回のつづき

モデルクラスの実装

Noteクラスはカラムに対応したメンバ変数とgetter/setterがあるだけの仕組みです。Categoryも同様なのでサンプルコードを見てください。

public class Note {
    private long id;
    private String title;
    private String comments;
    private Category category;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getComments() {
        return comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }

    public Category getCategory() {
        return category;
    }

    public void setCategory(Category category) {
        this.category = category;
    }
}

BaseDAOクラス

NoteDAOとCategoryDAOはBaseDAOを継承しています。BaseDAOの実装は以下のとおり。

public class BaseDAO {
    protected SQLiteDatabase db;

    public BaseDAO(SQLiteDatabase db) {
        this.db = db;
    }
}

db(SQLiteDatabase)はprotectedなので、継承先のNoteDAO、CategoryDAOからアクセスできます。

db.queryを使ってすべてのNoteをメソッドfindAll。

    public List findAll() {
        CategoryDAO categoryDAO = new CategoryDAO(db);
        Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
        List noteList = new ArrayList();
        try {
            while (cursor.moveToNext()) {
                Note note = noteFromCursor(cursor);
                noteList.add(note);
            }
        } finally {
            cursor.close();
        }
        return noteList;
    }

noteFromCursorメソッドでDBからデータを読み込み、Noteオブジェクトとして実体化します。

    private Note noteFromCursor(Cursor cursor) {
        Note note = new Note();
        note.setId(cursor.getLong(cursor.getColumnIndex("id")));
        note.setTitle(cursor.getString(cursor.getColumnIndex("title")));
        note.setComments(cursor.getString(cursor.getColumnIndex("comments")));

        long categoryId = cursor.getLong(cursor.getColumnIndex("category_id"));
        if (categoryId > 0) {
            note.setCategory(categoryDAO.findById(categoryId));
        }
        return note;
    }

CategoryDAO.findByIdでCategoryをオブジェクト化してNoteにひもづけていることにも注目。CategoryDAO#findByIdの実装はいかのとおり。

    public Category findById(long id) {
        Cursor cursor = db.query(TABLE_NAME, null, "id = ?", new String[]{ String.valueOf(id) }, null, null, null);
        Category category = null;
        try {
            if (cursor.moveToNext()) {
                category = categoryFromCursor(cursor);
            }
        } finally {
            cursor.close();
        }
        return category;
    }

Noteを追加・更新するNoteDAO#saveメソッド。

    public void save(Note note) {
        ContentValues values = new ContentValues();
        values.put("title", note.getTitle());
        values.put("comments", note.getComments());
        if (note.getCategory() != null) {
            values.put("category_id", note.getCategory().getId());
        } else {
            values.put("category_id", (Long)null);
        }
        if (note.getId() > 0) {
            db.update(TABLE_NAME, values, "id = ?", new String[]{String.valueOf(note.getId())});
        } else {
            long id = db.insert(TABLE_NAME, null, values);
            note.setId(id);
        }
    }

Model、DAOの実装はこんな感じです。TransactionやDatabaseを閉じる処理などをDAOには含めないことに注目。これはTransaction内で複数のメソッド呼び出しを行う仕組みにするためです。

その3へつづく
SQLiteデータベースのアクセスとクラス設計 その3