【问题标题】:Query on inverse relationship反向关系查询
【发布时间】:2016-03-10 20:53:33
【问题描述】:

我是 Realm 的新手,遇到的查询问题让我疯狂了好几天。我有 2 个简单的类 Dog 和 Person 作为:

class Dog: Object {
    dynamic var dogName = ""
    dynamic var dogAge = 1
    var owners: [Person] {
       return linkingObjects(Person.self, forProperty: "dogs")
    }
}

class Person: Object {
    dynamic var firstName = ""
    let dogs = List<Dog>()
}

向Realm添加数据后,我有以下数据:

  • 奥斯卡有 3 只狗,分别是 A、B 和 C,年龄分别为 4、6 和 9 岁
  • Jennifer 有 3 只狗,分别是 D、E 和 F,年龄分别为 1、2 和 7 岁
  • 一只名叫 Z 的狗,8 岁,没有主人。

let database = try! Realm()
// Query all Dogs- It should have 7 dogs
let allDogs = database.objects(Dog)
print("A total of \(allDogs.count) dogs")   // 7 dogs - correct

// Query All dogs between age of 4 and 12 - there should be 5 dogs

let agedDogs = database.objects(Dog).filter("dogAge BETWEEN {4,12}")
print("Dogs between Age 4 and 12 = \(agedDogs.count) \n")   // 5 dogs - OK

我想知道所有agedDog,其中有多少属于奥斯卡? 我试过了:

let specificOwnerAgedDogs = agedDogs.filter("ANY owners.firstName = 'Oscar'")
print("Oscar Dogs between Age 4 and 12 = \(specificOwnerAgedDogs)")

但是这个查询导致错误:

由于未捕获的异常“无效的属性名称”而终止应用程序,原因:在“狗”类型的对象中找不到“属性“所有者””

我将 Realm Swift 与 Swift 2.1.1 一起使用。

【问题讨论】:

    标签: relationship realm


    【解决方案1】:

    Realm Swift does not yet support provide direct support for queries that traverse inverse relationships,例如 Dog 类的 owners 属性。这是我们正在做的事情,应该会在不久的将来将其纳入 Realm Swift 版本中。

    目前,您可以通过在 Swift 中而不是在谓词中执行一些过滤来解决此限制:

    let specificOwners = database.objects(Person).filter("firstName = 'Oscar'")
    let specificOwnerAgedDogs = specificOwners.flatMap() { owner in
        owner.dogs.filter() { $0.dogAge >= 4 && $0.dogAge <= 12 }
    }
    

    【讨论】:

    • 非常感谢。我现在感觉好多了。也感谢您的解决方案
    • 但是,我的最终目标是找到所有没有主人的 4 到 12 岁的狗,以便有人可以收养他/她
    • 上面链接的功能请求,跟踪此功能已经关闭了几年。
    【解决方案2】:
    let noOwn = agedDogs.flatMap {
       (ndog) -> Dog? in
       ndog.owners == [] ? ndog : nil
    }
    

    我使用此代码找出没有任何所有者的所有agedDogs 的列表? 对此有什么想法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 2012-06-17
      • 2022-01-22
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多