以前いくつかの方法で錯綜していたデータベースの使い方ですが、ある程度自分の中で手法が定まってきたのでご紹介したいと思います。
以前の記事は下記ですが、それのまとめに近い形です。(軽量化はしてないです。。)
SQLiteについて、初心者丸出しであっちこっち調べたメモ。
今回のサンプルはカンタンに曜日の中に数値をいれるというデータベースを作成してみます。
step1:最初に保持クラスを作成してみます。
public class DayObject implements Serializable{ /** * データベースに格納する為のデータ */ private static final long serialVersionUID = 1L; public int id; public int mon; public int tue; public int wed; public int thu; public int fri; public int sat; public int sun; } DayObject _do = new DayObject();
コンストラクタなどで、初期値を設定してあげてもいいかもしれません。
Serializableを継承しておくと、Activity間の受け渡しができるようになっているので、継承しておきます。
step2:データベース関係のクラスを作る。
class DataBaseUtil の中に作成していきます。
step3:各関数を用意する。
■データベースの作成
public static void makeDataBase(Context _context){ /*データベース作成設定*/ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); String _createSql = "CREATE TABLE IF NOT EXISTS days"+"(_id INTEGER PRIMARY KEY AUTOINCREMENT"; _createSql += " , mon INTEGER"; _createSql += " , tue INTEGER"; _createSql += " , wed INTEGER"; _createSql += " , thu INTEGER"; _createSql += " , fri INTEGER"; _createSql += " , sat INTEGER"; _createSql += " , sun INTEGER"; _createSql += ")"; db.execSQL(_createSql); db.close(); }
■取得
public static ArrayList<DayObject> getRecord(Context _context){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); Cursor c = db.query( "days",null,null, null, null, null, null ); ArrayList<DayObject> _alits = new ArrayList<DayObject>(); while(c.moveToNext()){ DayObject _obj = new DayObject(); _obj.mon = c.getInt(c.getColumnIndex("mon")); _obj.tue = c.getInt(c.getColumnIndex("tue")); _obj.wed = c.getInt(c.getColumnIndex("wed")); _obj.thu = c.getInt(c.getColumnIndex("thu")); _obj.fri = c.getInt(c.getColumnIndex("fri")); _obj.sat = c.getInt(c.getColumnIndex("sat")); _obj.sun = c.getInt(c.getColumnIndex("sun")); _obj.id = c.getInt(c.getColumnIndex("_id")); _alits.add(_obj); } c.close(); db.close(); return _alits; }
■登録:登録の後に値を取得して返すまでを1つのフローにしています。
public static ArrayList<AlarmObject> addRecord(Context _context,DayObject obj){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); ContentValues _cv = new ContentValues(); _cv.put("mon", obj.mon); _cv.put("tue", obj.tue); _cv.put("wed", obj.wed); _cv.put("thu", obj.thu); _cv.put("fri", obj.fri); _cv.put("sat", obj.sat); _cv.put("sun", obj.sun); db.insert("days", null, _cv); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; }
■編集
public static ArrayList<DayObject> editRecord(Context _context,DayObject obj){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); ContentValues _cv = new ContentValues(); _cv.put("mon", obj.mon); _cv.put("tue", obj.tue); _cv.put("wed", obj.wed); _cv.put("thu", obj.thu); _cv.put("fri", obj.fri); _cv.put("sat", obj.sat); _cv.put("sun", obj.sun); String[] arg = {Integer.toString(obj.id)}; db.update("days", _cv, "_id=?", arg); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; }
■削除
public static ArrayList<DayObject> deleteRecord(Context _context,Integer _id){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); String[] arg = {Integer.toString(_id)}; db.delete("days", "_id=?", arg); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; }
■単体での取得
public static AlarmObject getRecordSingle(Context _context,Integer _id){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); Cursor c = db.query( "days",null,"_id=?", new String []{Integer.toString(_idnum)}, null, null, null ); DayObject _obj = new DayObject(); while(c.moveToNext()){ _obj.mon = c.getInt(c.getColumnIndex("mon")); _obj.tue = c.getInt(c.getColumnIndex("tue")); _obj.wed = c.getInt(c.getColumnIndex("wed")); _obj.thu = c.getInt(c.getColumnIndex("thu")); _obj.fri = c.getInt(c.getColumnIndex("fri")); _obj.sat = c.getInt(c.getColumnIndex("sat")); _obj.sun = c.getInt(c.getColumnIndex("sun")); _obj.id = c.getInt(c.getColumnIndex("_id")); } c.close(); db.close(); return _obj; }
上記で関数を先に書いてしまいましたが削除などはIDだけで、実行ができたりしますが、基本的には、上記で作成したクラスDayObjectをひとつのデータの単位として利用をすると、わりと定型的な利用ができると思います。
まとめると以下のような形です。
public class DataBaseUtil { public static void makeDataBase(Context _context){ /*データベース作成設定*/ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); String _createSql = "CREATE TABLE IF NOT EXISTS days"+"(_id INTEGER PRIMARY KEY AUTOINCREMENT"; _createSql += " , mon INTEGER"; _createSql += " , tue INTEGER"; _createSql += " , wed INTEGER"; _createSql += " , thu INTEGER"; _createSql += " , fri INTEGER"; _createSql += " , sat INTEGER"; _createSql += " , sun INTEGER"; _createSql += ")"; db.execSQL(_createSql); db.close(); } public static ArrayList<DayObject> getRecord(Context _context){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); Cursor c = db.query( "days",null,null, null, null, null, null ); ArrayList<DayObject> _alits = new ArrayList<DayObject>(); while(c.moveToNext()){ DayObject _obj = new DayObject(); _obj.mon = c.getInt(c.getColumnIndex("mon")); _obj.tue = c.getInt(c.getColumnIndex("tue")); _obj.wed = c.getInt(c.getColumnIndex("wed")); _obj.thu = c.getInt(c.getColumnIndex("thu")); _obj.fri = c.getInt(c.getColumnIndex("fri")); _obj.sat = c.getInt(c.getColumnIndex("sat")); _obj.sun = c.getInt(c.getColumnIndex("sun")); _obj.id = c.getInt(c.getColumnIndex("_id")); _alits.add(_obj); } c.close(); db.close(); return _alits; } public static ArrayList<AlarmObject> addRecord(Context _context,DayObject obj){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); ContentValues _cv = new ContentValues(); _cv.put("mon", obj.mon); _cv.put("tue", obj.tue); _cv.put("wed", obj.wed); _cv.put("thu", obj.thu); _cv.put("fri", obj.fri); _cv.put("sat", obj.sat); _cv.put("sun", obj.sun); db.insert("days", null, _cv); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; } public static ArrayList<DayObject> editRecord(Context _context,DayObject obj){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); ContentValues _cv = new ContentValues(); _cv.put("mon", obj.mon); _cv.put("tue", obj.tue); _cv.put("wed", obj.wed); _cv.put("thu", obj.thu); _cv.put("fri", obj.fri); _cv.put("sat", obj.sat); _cv.put("sun", obj.sun); String[] arg = {Integer.toString(obj.id)}; db.update("days", _cv, "_id=?", arg); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; } public static ArrayList<DayObject> deleteRecord(Context _context,Integer _id){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); String[] arg = {Integer.toString(_id)}; db.delete("days", "_id=?", arg); db.close(); ArrayList<DayObject> _al = DataBaseUtil.getRecord(_context); return _al; } public static AlarmObject getRecordSingle(Context _context,Integer _id){ String _path = "/data/data/"+_context.getPackageName() + "/file.db"; SQLiteDatabase db; db = SQLiteDatabase.openOrCreateDatabase(_path, null); Cursor c = db.query( "days",null,"_id=?", new String []{Integer.toString(_idnum)}, null, null, null ); DayObject _obj = new DayObject(); while(c.moveToNext()){ _obj.mon = c.getInt(c.getColumnIndex("mon")); _obj.tue = c.getInt(c.getColumnIndex("tue")); _obj.wed = c.getInt(c.getColumnIndex("wed")); _obj.thu = c.getInt(c.getColumnIndex("thu")); _obj.fri = c.getInt(c.getColumnIndex("fri")); _obj.sat = c.getInt(c.getColumnIndex("sat")); _obj.sun = c.getInt(c.getColumnIndex("sun")); _obj.id = c.getInt(c.getColumnIndex("_id")); } c.close(); db.close(); return _obj; } }
以上です。