前回のつづき

OpenHelperクラス

public class OpenHelper extends SQLiteOpenHelper {
    private static final int DB_VERSION = 1;

    public OpenHelper(Context ctx, String filename) {
        super(ctx, filename, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        CategoryDAO.createTable(db);
        NoteDAO.createTable(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

SQLiteOpenHelperクラスを継承し、onCreateでテーブル作成します。ここにSQLを書くより、おのおののDAOのcreateTableメソッドで書いたほうが、隠蔽性があってよさ気なので、そのようにしています。

NoteDAO#createTableの実装。

    public static void createTable(SQLiteDatabase db) {
        db.execSQL(
                "CREATE TABLE " + TABLE_NAME + " (" +
                        "id              INTEGER PRIMARY KEY AUTOINCREMENT," +
                        "title           TEXT NOT NULL," +
                        "comments        TEXT NOT NULL," +
                        "category_id     INTEGER" +
                        ");"
        );
    }

Transactionクラス

public class Transaction {
    public static interface Runner {
        public T run(SQLiteDatabase db);
    }

    public T run(Context context, String filename, Runner runner) {
        SQLiteOpenHelper helper = new OpenHelper(context, filename);
        SQLiteDatabase db = helper.getWritableDatabase();
        try {
            db.beginTransaction();
            try {
                T ret = runner.run(db);
                db.setTransactionSuccessful();
                return ret;
            } finally {
                db.endTransaction();
            }
        } finally {
            db.close();
        }
    }
}

runメソッドでTransactionの開始や終了、Databaseを閉じる処理をおこなっています。間違うと面倒事になりそうな処理は、このクラスだけに収まり、他で書くことはありません。

Transaction#Runnerインターフェースのrunメソッド内で、DAOのメソッドを呼び出して処理を行います。

    private void write() {
        Transaction tx = new Transaction<>();
        tx.run(this, DATABASE_FILENAME, new Transaction.Runner() {
            @Override
            public Boolean run(SQLiteDatabase db) {
                CategoryDAO categoryDAO = new CategoryDAO(db);
                NoteDAO noteDAO = new NoteDAO(db);

                Category category = new Category();
                category.setName("Internet");
                categoryDAO.save(category);

                Note note;

                note = new Note();
                note.setTitle("Review Nexus 7 2015.");
                note.setComments("Comments01");
                note.setCategory(category);
                noteDAO.save(note);

                return true;
            }
        });
    }

いかがでしょうか?汎用性が高く、Transaction終了漏れ、Databaseクローズ漏れというありがちなミスを防ぐ仕組みになっていると思います。