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?")という条件には最初と最後の名前がマッチします。

日本語最新版のRealmQueryのAPIリファレンス

最新版のRealmQueryのAPIリファレンス

データベースの更新

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の終了。