36392

[code]

    class Dog: Object {
        dynamic var name = ""
        dynamic var age = 0
        let owners = LinkingObjects(fromType: Person.self, property: "dogs")
    }
    class Person: Object {
        dynamic var name = ""
        let dogs = List<Dog>()
    }
    
[/code]

追加したデータ

[code]

    realm.add(Person(value: ["AAA", [["taro", 1], ["pochi", 6]]]))  
    realm.add(Person(value: ["BBB", [["kuro", 1], ["hachi", 6]]]))  
    realm.add(Person(value: ["CCC", [["taro", 6], ["pochi", 6]]]))  
    realm.add(Person(value: ["DDD", [["kuro", 6], ["chibi", 6]]]))  
    
[/code]

たとえば、上記のモデルとデータで。

dog.nameが"taro" かつdog.ageが5以下のpersonsを得るには  
どのような検索を記述すればよいのでしょうか？

Dogを検索し、ownerをたどってpersonを得ることはできました。

[code]

    let dogs = realm.objects(Dog.self).filter(NSPredicate(format: "name = 'taro' && age <= 5"))
    for dog in dogs {
        for p in dog.owners {
            NSLog(p.name)
        }
    }
    
[/code]

Personを検索して同様の結果を得る記述方法はあるでしょうか？


CC BY-SA 3.0
2017-07-14T14:44:28.800
36368
2017-07-15T21:47:58.690
2017-07-15T21:47:58.690
5519
20521
question
swift ios realm
Realmのコレクション要素に対する検索条件の記述について

[code]

    let results = realm.objects(Person.self)
                .filter("any dogs.name = %@ && any dogs.age <= %d", "taro", 5)
    
[/code]

「dog.nameが"taro" かつdog.ageが5以下」というクエリはこのように書きます。

`any`はAggregate Operationsというコレクションの各要素が条件に一致するかどうかを調べる演算子です。

RealmのクエリはNSPredicateのAPIをそのまま使っているだけなので、NSPredicateについて学べばわかります。より詳しく知りたい場合は下記のアップル公式ドキュメントをご覧ください。

<https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215891>


CC BY-SA 3.0
2017-07-15T14:29:14.023
36392
2017-07-15T14:29:14.023
5519
36368
answer