Kotlinでアンドロイドアプリを作るうえでのAndroidStudioでのRealmの設定と使い方。
Realm使う前に初期設定
Realmのインストール
まずRealmをインストールする。(Realmの公式ホームページ)
まずprojectレベルのbuild.gradleに下記のコードを入れる。
buildscript { repositories { jcenter() } dependencies { classpath "io.realm:realm-gradle-plugin:3.7.0" } }
追加するのはclasspath "io.realm:realm-gradle-plugin:3.7.0"
だけでいい。
次にappレベルのbuild.gradleの一番上に下記のコードを追加する。
apply plugin: 'realm-android'
するとgradle files have changed since last project sync a project syncのような文が上に表示されるのでSync nowを押す。
Sync nowを押したときに以下のようなエラーが出た。
Error:Conflict with dependency 'com.google.code.findbugs:jsr305' in project ':app'. Resolved versions for app (3.0.2) and test app (2.0.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details. 英語の説明 どうやらappとtest appのバージョンが違うみたいである。
android { configurations.all { resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' } }
上記のコードをappレベルのbuild.gradleに追記し、Sync nowを押すとうまく動いた。
Realmの使い方
Realmの初期化
まずはRealmを初期化しないといけない。
Applicationクラス androidアプリが起動したときに作成され、呼び出されるクラス。 ⇒アプリが立ち上がる時に行いたい設定や、アプリ内で共有したいデータを設定するときに使える。 Applicationクラスを継承した自作クラスの作成 マニュフェストファイルの“application”タグに作成したクラスを設定
app→java→packageを右クリック。その後New→Kotlin file/Class→kindをclassにしてNameを入れる。
次に新しく作ったクラスで下記のコードを追加。
class MyApplication: Application() { override fun onCreate() { super.onCreate() //Realmの初期化 Realm.init(this) } }
次にマニュフェストファイルの“application”タグに作成したクラスを追加。
<application android:allowBackup="true" android:theme="@style/AppTheme" android:name=".クラス名">
DBのクラスの作成
app→java→packageを右クリック。その後New→Kotlin file/Class→kindをclassにしてDBのNameを入れる。
open class クラス名(MemoDB) :RealmObject(){ var strMemo: String = "" }
Kotlinではクラスの継承はopenをつけないといけない。
アクティビティでの設定
Realmインスタンスはメソッドを跨って使うのでclass下で書き出しておく。
//Realm lateinit var realm:Realm
onResumeメソッドを作成して、Realmインスタンスを取得。
override fun onResume() { super.onResume() //Realmインスタンスの取得 realm = Realm.getDefaultInstance() }
onPauseメソッドを作成して、Realmインスタンスの削除。
override fun onPause() { super.onPause() //インスタンスの片付け realm.close() }
Realmの書き込み
Realmの書き込み(追加、変更、削除)は必ずトランズアクションの中で行わければならない。
// Obtain a Realm instance Realm realm = Realm.getDefaultInstance(); realm.beginTransaction(); //... オブジェクトの追加や更新 ... realm.commitTransaction();
Realmでのデータの登録
realm.beginTransaction() val dbMemo = realm.createObject(MemoDB::class.java) dbMemo.strMemo = editTextMemo.text.toString() realm.commitTransaction()
realm.beginTransaction()
でRealmの開始。
val dbMemo = realm.createObject(DBのクラス::class.java)
でデータベース登録の準備。
dbMemo.フィールド名 = 登録するデータ
でデータをセットする。
realm.commitTransaction()
でRealmの終了。
Realmでのデータの取得
val results:RealmResults<MemoDB>= realm.where(MemoDB::class.java).(検索条件).findAll().sort(strMemo)
realm.where(DBのクラス::class.java).findAll().sort(フィールド名)
.findAll()
は全検索。
.sort(フィールド名)
はソート。
すべてのデータ型に使えるメソッド。
メソッド | 意味 |
---|---|
equalTo("フィールド名", 値) | 値と一致するものを検索 |
notEqualTo("フィールド名", 値) | 値と一致しないものを検索 |
in("フィールド名", 値(複数)) | 複数の値に対して一致するものを検索 |
数値型およびDate型のフィールドに使えるメソッド
メソッド | 意味 |
---|---|
between("フィールド名",A,B) | AとBの間の値を検索(両端を含む) |
greaterThan("フィールド名", 値) | 値より大きいものを検索 |
lessThan("フィールド名", 値) | 値より小さいものを検索 |
greaterThanOrEqualTo("フィールド名", 値) | 値以上のものを検索 |
lessThanOrEqualTo("フィールド名", 値) | 値以下のものを検索 |
String型のフィールドに使えるメソッド
Case.INSENSITIVEをセットすると大文字小文字の区別を無視して検索する。
デフォルト値はCase.SENSITIVE(大文字小文字の区別を無視しない)。
メソッド | 意味 |
---|---|
contains("フィールド名",文字列値) | 文字列値が含まれているものを検索 |
beginsWith("フィールド名",文字列値) | 文字列値で始まるものを検索 |
endsWith("フィールド名",文字列値) | 文字列値で終わるものを検索 |
like("フィールド名",文字列値) | 文字列値を検索。ワイルドカードを利用できる。 |
like()はワイルドカードが利用できます。ワイルドカードの書式は下記の通りです。 /は0個または複数のユニコード文字列にマッチします。 /?は1つのユニコード文字にマッチします。 例えば、nameというフィールドがあるオブジェクトについて、それぞれWilliam、Bill、Jill、Trillianと設定されているとします。そのとき、like("name", "?ill")という条件には最初の3つの名前がマッチします。like("name", "*ia?")という条件には最初と最後の名前がマッチします。
データベースの更新
val selectedDB = results.get(IntPosition) realm.beginTransaction() selectedDB.strMemo = editTextMemo.text.toString() realm.commitTransaction()
results.get(IntPosition)
は抽出したデータからIntPositionのものを取り出す。
realm.beginTransaction()
でRealmの開始。
selectedDB.フィールド名 = 更新するデータ
でデータを取り出した番号のフィールドに代入する。
realm.commitTransaction()
でRealmの終了。
データベースの削除
val selectedDB = results[Intposition] realm.beginTransaction() selectedDB.deleteFromRealm() realm.commitTransaction()
results[Intposition]
は抽出したデータからIntPositionのものを取り出す。
realm.beginTransaction()
でRealmの開始。
selectedDB.deleteFromRealm()
でデータをデータベースから削除。
realm.commitTransaction()
でRealmの終了。