新人成長記録15th
今回は、DB(DataBase)について書いていきます
DBは一定の形式で作成された大量のデータを保持する時に使用します
AndroidのDBにはSQLiteが使われているので、クエリを書く際にはSQLiteに則った記述をする必要があります
DBとTableの作成
初めに、DBを作成するところから始まります
作成するためには、SQLiteOpenHelperを拡張した独自クラスを作成します
以下が作成した、独自クラスになります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class Helper extends SQLiteOpenHelper { private static final int version = 1; //コンストラクタ public Helper(Context context) { super(context, "TEST.db", null, version); } //ライフサイクル @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE test_t " + "(id INTEGER PRIMARY KEY, title VARCHAR(128));"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //バージョン変更時呼び出される // NOP } } |
コンストラクタで親クラスに渡す引数は4つあります
第1引数:Context(インスタンス生成時に引数にしたcontextをそのまま流用)
第2引数:String(DBの名前)
第3引数:CursorFactory(selectなどでCursorが生成される時に独自クラスの使用ができる、基本的にはnull)
第4引数:int(DBのバージョンを指定)
SQLiteOpenHelperを拡張したことで実装しなければならないライフサイクルは2つあります
onCreate:インスタンス生成時にDBが存在しなければ呼ばれます
onUpgrade:DBのバージョンが変更されると呼ばれます
DBの使用
作成したDBを使用する時には、以下のような記述になります
1 2 3 4 5 6 |
Helper helper = new Helper(this); //読み書き SQLiteDatabase wdb = helper.getWritableDatabase(); //読み込み SQLiteDatabase rdb = helper.getReadableDatabase(); |
読み書きをする時(DELETE/INSERT/UPDATE/SELECT)は、getWriteableDatabase()メソッドでオブジェクトを取得します
読み込みのみの時(SELECT)は、getReadableDatabase()メソッドでオブジェクトを取得します
Tableの操作
先ほど取得したSQLiteDatabaseオブジェクトを使用して、Tableから情報を取得したいと思います
Tableには何も入っていないので、まずはinsertしましょう
1 2 3 4 5 |
ContentValues values = new ContentValues(); values.put("id", 1); values.put("title","test1"); wdb.insert("test_t", null,values); |
insertの引数は3つです
第1引数:String(テーブル名)
第2引数:String(null値が許されていない場合に、代わりに挿入する値)
第3引数:ContentValues(挿入する値を保持するオブジェクト)
次に、挿入したレコードを編集したくなります
その時は、Updataを使用します
1 2 3 4 |
values.put("id",1); values.put("title","test2"); int a = wdb.update("test_t",values, "id = ?",new String[] {"1"}); |
updataの引数は4つです
第1引数:String(テーブル名)
第2引数:ContentValues(挿入する値)
第3引数:String[](変更を加えるレコードの条件)
第4引数:String[](変更を加えるレコードの条件の?部分の配列)
deleteもupdataと似たようなもので、第2引数の挿入する値がなく3つの引数からなります
最後にレコードの抽出をqueryで行います
1 2 3 4 5 |
Cursor cursor = wdb.query("test_t", new String[]{"id", "title"}, null,null,null,null,null); cursor.moveToFirst(); cursor.getString(1); cursor.close(); |
queryの引数は7つですが、8つのものもあります
第1引数:String(テーブル名)
第2引数:String[](取得するカラム名)
第3引数:String(取得するレコードの条件)
第4引数:String[](取得するレコードの条件の?部分の配列)
第5引数:String(グループ化するカラム名)
第6引数:String(グループ化した後の条件)
第7引数:String(並び替えるカラム名)
第8引数:String(取得するレコードの上限)※なくても可
queryの場合は、Cursorが取得でき、レコード情報が含まれています
対象レコードが0件の時は、null値となります
Cursorクラスのget(カラム番号)でレコードから情報が取得できます
レコードが複数件ある時は、moveToNext()で次のレコードへ移動します
不要になったCursorはclose()で閉じます
最後に、SQLiteDatabaseオブジェクトのclose()も忘れないようにしましょう
終わりに
DBは大量のデータを保存出来て便利で、規模の大きいシステムなどは多くのユーザが参照や変更を行います
DBに多くのユーザーが同時にアクセスする場合には、変更中のデータには触って欲しくないものです
変更中のデータに変更を加えられるとデータが壊れています可能性があるからです
そういった時に、排他的な処理をしてくれるものに、トランザクションがあります
次回は、このトランザクション処理を書きたいと思います
火曜日担当:poppy
admin at 2016年11月22日 10:00:18