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