新人成長記録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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム