無題

電気科の学生がお笑いとお酒と旅行の記事を書きます(つもり)

【Realm】LinkingObjectについて

はじめに

ここ最近Kotlin使ってAndroidアプリ開発を数日やらせてもらいましたが、そのなかでrealmというデータベースを使う機会がありました。
いろいろな機能があるんですが、なかでも```LinkingObject```というものが、便利なんですが初めましての私には少々難解に思えたため、自分用に後で見直せるように解説を軽く書き記しておきます。

LinkingObgectとは

まず、realmを使うにあたり、Database用のclassを作成します。
で、異なる二つのクラスをつなげたい、関連性を持たせたい、というときがあるわけです。
例えば、「犬」と「飼い主」で考えたとしましょう。
それぞれの犬には、「色」や「年齢」、「名前」などの特徴があり、飼い主にも「名前」「性別」「年齢」...などの特徴があるわけです。
この2つのクラスを引っ付けるために、LinkingObjectを使います。

たとえば、こんな感じ。

//飼い犬
open class Dog : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var color:String = ""
    var age: Int = 0
}

//飼い主
open class Owner : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var sex: Int = 0 //male
    var age: Int = 0
}

これは、まだ両者の情報を紐づけできていません。
紐づけするには、こうやります。

//飼い犬
open class Dog : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var color:String = ""
    var age: Int = 0
    var owner: Owner? = null
}

//飼い主
open class Owner : RealmObject() {
    @PrimaryKey
    var id: Int = 0
    var name: String = ""
    var sex: Int = 0 //male
    var age: Int = 0

    @LinkingObjects("owner")
    val dogs RealmResults<Dog>? = null
}

今回は、飼い主さんのほうにLinkingObjectを追加しました。
これは、こんな関係になってるみたいです。
「飼い主から犬は『dogs』というプロパティでみえ、犬から飼い主は『owner』というプロパティで見える」
ちょっとわかりづらいかもしれません...すみません

変わって、画像で説明します。
例えば、今こう言うデータが登録されているとします。

f:id:waewae96:20181014204636p:plain

同じ色の大きな四角で囲まれているものが、飼い主と飼い犬の関係にあります。AikoさんはLoveちゃんを飼っていますし、KenjiさんはLonくんとYukiちゃんを飼っています。この「飼う飼われる」の関係を紐づけたいわけです。で、上記のやり方で紐づけて、保存できたとします。紐づけ方は基本的なプロパティの使い方と同じようにしてやればよいです。

呼び出し方

私が一番詰まったのは呼び出し方で、特に、Linkされた側からの呼び出し。例えば、「Loveちゃんの年齢」が欲しいときには、普通に

     val love = realm.where<Dog>().equalTo("name", love).findFirst()
     val loveAge = love.age

でいいわけですが、じゃあ言い方を変えて、「Aikoさんの飼い犬の年齢」が欲しいときは、どうすればよいのか、で初心者の私はつまづいたわけです、詳しいリファレンスがないので...

で、いろいろやってみた結果こうしたらうまくいきました

     val dog = realm.where<Dog>().equalTo("owner.name", Aiko).findFirst()
     val dogAge = dog.age

というか、冷静に考えればそうだよな、「Dog」Classの「owner」プロパティがその犬の飼い主だもの。
ほかの言語で考えればそうなのですが、Kotlinだしrealmだし、しかもLinkingObject知らねえしで身構えちゃうとこういうミスをおかしがちなのかもしれません...ね。