LoginSignup
17

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

Last updated at Posted at 2017-07-24

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

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

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

※クラスの作成例


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オブジェクトを元に検索、削除、更新を行うメソッドを作成(このクラスでバリデーション処理を行ってもよいかも)

※クラスの作成例

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;
    }
}


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17