新人成長記録15th
今回は、DB(DataBase)について書いていきます
DBは一定の形式で作成された大量のデータを保持する時に使用します
AndroidのDBにはSQLiteが使われているので、クエリを書く際にはSQLiteに則った記述をする必要があります
DBとTableの作成
初めに、DBを作成するところから始まります
作成するためには、SQLiteOpenHelperを拡張した独自クラスを作成します
以下が作成した、独自クラスになります
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を使用する時には、以下のような記述になります
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しましょう
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を使用します
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で行います
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