簡単にクエリを実行させたい人向き。

 SQLiteでデータベースを利用するためにはSQLiteOpenHelperを利用する。これを利用することでDBとの接続を簡単に行うことができる。
 SQLiteOpenHelperを継承したクラスを作り、onCreateとonUpgradeを実装する。onCreateではテーブルがなかったときにテーブルを作るクエリを記述しておく。
 スーパークラスの呼び出しの第二引数は、データベースの名称を指定する。簡単に言うとファイル名のようなもの。第三引数とオリジナルのcursorを作るときなどに利用されるが、ほぼ100%でnullが設定されている。第四引数はデータベースのバージョンで、あとからテーブル構造などが変わったときに使用される。

class UserDBHelper(var context: Context?) : SQLiteOpenHelper(context, "sample.db", null, 1) {
    override fun onCreate(db: SQLiteDatabase?) {
        //データベースがないときに実行される
        db?.execSQL("create table sample ( " +
                "_id integer primary key autoincrement, " +
                "name text not null, " +
                "years integer not null " +
                ");")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        //バージョンアップしたときに実行される
        //テーブルのdeleteなどを行う
    }
}


 実際のクエリの実行は下記のようにして行う。


        findViewById<Button>(R.id.btnInsert).setOnClickListener {
            //データベースへの接続
            val db: SQLiteDatabase = UserDBHelper(this).writableDatabase

            //insertするときは、ContentValuesを利用してあらかじめフィールド名と値の組み合わせを指定しておく
            //これはSQLインジェクションを防止するため            
            for (i: Int in 1..10) {
                val value: ContentValues = ContentValues().also {
                    it.put("name", "name" + i.toString())
                    it.put("years", i + 20)
                }
//第一引数はテーブル名 //第二引数はvalueがないときにnullを入れるフィールド名を指定する db.insert("sample", null, value) } //closeはしなくてもいいらしい //db.close() } findViewById<Button>(R.id.btnSelect).setOnClickListener { val db: SQLiteDatabase = UserDBHelper(this).writableDatabase //selectはrawQueryのほうがクエリを直接かけるので楽 //第二引数は、第一引数にある?の部分に早いほうから順番に置き換えられる //下の例だとwhere years > 22 and years < 26という意味になる //これもSQLインジェクション対策 val cursor: Cursor = db.rawQuery("select * from sample where years > ? and years < ? ", arrayOf("22", "26")) //カーソルのcloseは必須 cursor.use { while (cursor.moveToNext()) { Log.v("nullpo", "----------")
//select文に書かれたフィールドの順番で取得する Log.v("nullpo", cursor.getInt(0).toString()) Log.v("nullpo", cursor.getString(1)) Log.v("nullpo", cursor.getInt(2).toString()) } } //closeはしなくてもいいらしい //db.close() } findViewById<Button>(R.id.btnUpdate).setOnClickListener { //updateもinsertと基本的には同じだが、置換する行を指定することが必要 val db: SQLiteDatabase = UserDBHelper(this).writableDatabase val value: ContentValues = ContentValues().also { it.put("name", "nurupo") } //第二引数がupdateする条件 第三引数はすでに説明したように?に置き換わる //下記の例だとname = "name3"となる。これもSQLインジェクション対策 db.update("sample", value, "name = ?", arrayOf("name3")) //closeはしなくてもいいらしい //db.close() } findViewById<Button>(R.id.btnDelete).setOnClickListener { val db: SQLiteDatabase = UserDBHelper(this).writableDatabase //行の削除もupdateと同様に指定する 下記はname = "nurupo"と同じ。 //これもSQLインジェクション対策 db.delete("sample", "name = ?", arrayOf("nurupo")) //closeはしなくてもいいらしい //db.close() }