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