2

realm.io (swift) で、ある「テーブル」からすべてのアイテムを選択して、他のテーブルにはない可能性があるかどうか疑問に思っていました。

2つのクラスがあるとしましょう:

class A: Object {
    dynamic var id: Int = 0
    dynamic var text: String = ""
}

class B: Object {
    dynamic var id: Int = 0
    dynamic var value: Bool = false
}

id が B に存在しない A からアイテムの結果を取得することは可能ですか?

4

1 に答える 1

3

NSPredicate実際には、レルム フィルター APIを使用してこれを行う非常に簡単な方法があります。

func fetch() throws -> [A] {
        do {
            // Create Realm
            let realm = try Realm()

            // Get B objects from Realm and put their IDs to [Int] array
            let IdB: [Int] = realm.objects(B).map { $0.id }

            // Create predicate
            // Filter all items where property id is not present in array IdB
            let predicateFilter = NSPredicate(format: "NOT (id IN %@)", IdB)

            // Get all A objects from array using predicateFilter
            let objectsA = realm.objects(A).filter(predicateFilter)

            // Return the [A] array
            return objectsA.map { $0 }
        } catch {

            // Throw an error if any
            throw error
        }

}

また、レルムを使用してフェッチされたすべてのオブジェクトは遅延ロードされることに注意してください。つまり、このメソッドも非常に高速です。ドキュメントから:

Realm ではすべてのクエリ (クエリとプロパティ アクセスを含む) は遅延です。データは、プロパティがアクセスされたときにのみ読み取られます。

于 2016-06-06T12:55:15.833 に答える