やりたいこと
今回はデータベースを作ったり、クエリを送るメソッドを紹介します。
openOrCreateDatabase
引数にDB名、動作モード(0かPrivate)、カーソルをインスタンス化させるファクトリクラスを渡すことで、それらに則ったDBが作られる。以下の例では、sqlite-test-1というデータベースを作っています。データーベースはdata/data/パッケージ名/database
というディレクトリに作られ、ターミナルから操作することも可能。
val database = baseContext.openOrCreateDatabase("sqlite-test-1.db", Context.MODE_PRIVATE, null) //databaseはsqlite-test-1.dbというDBが定義された
クエリをDBに送る
execSQL メソッドを使えば、簡単にクエリを送ることが出来る。しかし、全てのクエリをexecSQL で送れるという訳ではなく、SELECT / INSERT / UPDATE / DELETE対しては使うことが出来ない。テーブルの作成や削除、セーブに適したメソッド。
リファレンスに細かなことが書いてあります。:https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#execSQL(java.lang.String,%2520java.lang.Object%5B%5D)
var sql = "create table if not exists contacts(_id integer primary key not null, name text, phone integer, email text)"
database.execSQL(sql)
database.execSQL("drop table if exists contacts")
INSERT文
以下のように、ContentValues()内でカラムに対応するレコードを詰めてINSERT文書く。insertというメソッドは、引数にテーブル名、nullColumnHackというテーブルにnullを挿入するか否かを指定するパラメータ、ContentValue()をとって、テーブルに新たなレコードを挿入する。非常に簡単に行えることが分かる。
val values = ContentValues().apply {
put("name", "Fred")
put("phone", 12345)
put("email", "fred@nurk.com")
}
//applyの有無での比較↑↓
// val values = ContentValues()
// values.put("name", "Fred")
// values.put("phone", 12345)
// values.put("email", "fred@nurk.com")
val generatedId = database.insert("contacts", null, values)
カーソル
テーブルを読み込むときに使う。一行ずつカーソルがテーブルを読み取ることで効率的にデータを収集することが出来る。例えば、一気にDBのデータを呼び出したりしてしまうと、デバイスのメモリが死ぬ。しかし、カーソルを使うことでそれを防げる。以下ではSELECT文と一緒に使っている。
val query = database.rawQuery("select * from contacts", null)
query.use {
while (it.moveToNext()) { //カーソルが次のレコードに移動する。何もないならfalseを返す。
//全てのレコードを循環する
with(it) {
val id = getLong(0)
val name = getString(1)
val phone = getInt(2)
val email = getString(3)
val result = "ID: $id, Name = $name, phone = $phone, email = $email"
}
}
}
ここでは何を行っているかというと、rawQuery
メソッドを使ってセレクト文の結果を取得しています。rawQuery
メソッドはセレクト文等の結果が返されるクエリに対して用いるメソッドです。そして、そのクエリの結果をwhile文を通して一行ずつ取得しています。これが上で説明したカーソルです。
これらのメソッドを使う事で、おおよそのクエリをアンドロイド上で使うことが出来ます。