【Android】Android でデータベース処理を作る際の基本的な考え方と作成例

Androidでデータベースを使ったアプリケーションを開発する際のメモ

■基本的な考え方
１．DBの基礎を形成するDBHelperクラスを作成する
２．DBHelperクラスにアクセスしてテーブルの読み書き(CRUD)を担当するモデルクラスを作成する
３．任意のクラスからモデルクラスを通してデータ管理を行う

■DBHelperクラスについて
・SQLiteOpenHelperを継承している
・DB名、テーブル名、DBバージョンを定数として保持している

※クラスの作成例

```java

public class DbOpenHelper extends SQLiteOpenHelper {

    private static final String TAG = "DbOpenHelper";
    private static final String DATABASE_NAME = "chotecho.db";
    private static final String SCHEDULE_TABLE_NAME = "schedules";
    private static final int DATABASE_VERSION = 1;

    public DbOpenHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        createScheduleTable(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL("DROP TABLE IF EXISTS " + SCHEDULE_TABLE_NAME + ";");
        onCreate(db);

    }

    private void createScheduleTable(SQLiteDatabase db){
        // テーブル作成SQL
        String sql = "CREATE TABLE schedules ("
                + " id INTEGER PRIMARY KEY AUTOINCREMENT,"
                + " title TEXT,"
                + " place TEXT,"
                + " memo TEXT,"
                + " start_at TEXT,"
                + " date TEXT"
                + ");";
        db.execSQL(sql);
        Log.i(TAG,"テーブルschedulesが作成されました");
    }
}

```

■モデルクラスについて
・コンストラクタでDBHelperクラスインスタンスを生成
・DBHelperクラスインスタンスからgetWritableDatabaseでSQLiteDatabaseオブジェクトを取得
・SQLiteDatabaseオブジェクトを元に検索、削除、更新を行うメソッドを作成（このクラスでバリデーション処理を行ってもよいかも）

※クラスの作成例

```java
public class ScheduleModel {

    DbOpenHelper helper = null;
    SQLiteDatabase db = null;
    final String SCHEDULE_TABLE_NAME = "schedules";

    ScheduleModel(Context context){
        if(helper == null || db == null) {
            helper = new DbOpenHelper(context);
            db = helper.getWritableDatabase();
        }
    }

    public void createTacle(){

    }

    public String searchData(String date){
        // Cursorを確実にcloseするために、try{}～finally{}にする
        Cursor cursor = null;
        try{
            //SQL文
            String sql    = "SELECT * FROM " + SCHEDULE_TABLE_NAME + " WHERE date = ?";

            //SQL文の実行
            cursor = db.rawQuery(sql , new String[]{date});

            // 検索結果をcursorから読み込んで返す
            return readCursor( cursor );
        }
        finally{
            // Cursorを忘れずにcloseする
            if( cursor != null ){
                cursor.close();
            }
        }
    }

    /** 検索結果の読み込み */
    private String readCursor(Cursor cursor ){
        //カーソル開始位置を先頭にする
        cursor.moveToFirst();
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= cursor.getCount(); i++) {
            //SQL文の結果から、必要な値を取り出す
            sb.append(cursor.getString(1)).・・・//何か処理
            cursor.moveToNext();
        }
        return sb.toString();
    }

    public void insertData(String title, String place,String memo,String startAt, String date){
        String sql = "insert into " + SCHEDULE_TABLE_NAME + " (title, place, memo, start_at, date) values(?,?,?,?,?);";
        String[] bindStr = new String[]{
                title,
                place,
                memo,
                startAt,
                date
        };
        try {
            db.execSQL(sql, bindStr);
        } catch (SQLException e) {
            Log.e("ERROR", e.toString());
        }finally{
            // Cursorを忘れずにcloseする
            if( cursor != null ){
                cursor.close();
            }
        }
    }

    public void updateData(String title, String place,String memo,String startAt, String date){
        String sql = "update " + SCHEDULE_TABLE_NAME
                + " SET title =?, place = ?,memo = ?, start_at = ? "
                + "WHERE date = ? ;";
        String[] bindStr = new String[]{
                title,
                place,
                memo,
                startAt,
                date
        };
        try {
            db.execSQL(sql,bindStr);
        } catch (SQLException e) {
            Log.e("ERROR", e.toString());
        }
    }

    public void deleteData(String date){
        // ContentValuesのインスタンスにデータを格納
        String sql = "DELETE FROM " + SCHEDULE_TABLE_NAME
                + " WHERE date = ?;";
        String[] bindStr = new String[]{
                date
        };
        try {
            db.execSQL(sql,bindStr);
        } catch (SQLException e) {
            Log.e("ERROR", e.toString());
        }
    }

    public boolean validateData(String inputTitle, String inputPlace){
       //何かValid処理
        return val;
    }
}


```