検証環境
この記事の内容は、以下の環境で検証しました。
- Java:open jdk 1.8.0_152
- Kotlin 1.2.10
- Android Studio 3.0.2
- CompileSdkVersion:26
- MinSdkVersion:21
- TargetSdkVersion:26
- BuildToolsVersion:26.0.2
- gradle:4.0.0
- Android KTX:0.1
Android KTXとは
AndroidアプリのKotlinコードを簡潔に快適に記述できるように設計された拡張機能です。
提供元はGoogleです。オフィシャルのライブラリーになります。
※この記事を書いている時点(2018/02/08)では、プレビュー版のため、今後、APIの変更も予想されます。ご注意ください。
参考
Android Develpers Blog
https://android-developers.googleblog.com/2018/02/introducing-android-ktx-even-sweeter.html
Github
https://github.com/android/android-ktx/
API reference
https://android.github.io/android-ktx/core-ktx/
目標
Android KTXを利用したデータベースアクセスで、従来の記述方法との違いを確認する。
準備
Android KTXを使用するために、下記をbuild.gradleに追記してください。
repositories {
google()
}
dependencies {
implementation 'androidx.core:core-ktx:0.1'
}
注意点
Android KTXはcompileSdkVersionが27になっていなければ使用できません。
また、compileSdkVersionを27にする場合、その他のライブラリもバージョンを上げる必要があります。
結果的に以下のような形になります。
android {
compileSdkVersion 27
}
repositories {
google()
}
dependencies {
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'androidx.core:core-ktx:0.1'
}
実装
今回の例
テーブルを全件検索して、dataクラスに格納するコードを例とします。
テーブル
今回は下記のテーブルを使用します。
テーブル名:User
id | name |
---|---|
1 | 山田太郎 |
2 | 花子さん |
dataクラス
検索した結果を格納するクラスは以下のとおりです。
クラス名:UserEntity
data class UserEntity(val id:Int, val name:String)
データベースアクセス
Android KTXで記述すると以下のようになります。
val dbHelper = DatabaseOpenHelper(this)
dbHelper.readableDatabase.use {
val cursor = it.query("User", null, null, null, null, null, null)
while (cursor.moveToNext()) {
// KTXでの書き方
val ktxId = cursor.getInt("id")
val ktxName = cursor.getString("name")
val ktxData = UserEntity(ktxId, ktxName)
Log.e("KTX SQLiteDatabase", ktxData.toString())
}
}
従来の記述方法で書くと以下のようになります。
val dbHelper = DatabaseOpenHelper(this)
dbHelper.readableDatabase.use {
val cursor = it.query("User", null, null, null, null, null, null)
while (cursor.moveToNext()) {
// 従来の書き方
val idIndex = cursor.getColumnIndex("id")
val id = cursor.getInt(idIndex)
val nameIndex = cursor.getColumnIndex("name")
val name = cursor.getString(nameIndex)
val data = UserEntity(id, name)
Log.e("KTX SQLiteDatabase", data.toString())
}
}
差分だけを抜き出すと以下のようになります。
// KTXでの書き方
val ktxId = cursor.getInt("id")
val ktxName = cursor.getString("name")
// 従来の書き方
val idIndex = cursor.getColumnIndex("id")
val id = cursor.getInt(idIndex)
val nameIndex = cursor.getColumnIndex("name")
val name = cursor.getString(nameIndex)
従来の記述方法では、列名からインデックスを取得した後に、そのインデックスを使用して列のデータを取得していました。
Android KTXを利用することにより、Cursorから直接、列名を指定してデータを取得できるようになっています。