【问题标题】:Realm how to write subquery领域如何编写子查询
【发布时间】:2015-09-25 05:52:58
【问题描述】:

我正在研究 Realm db,这个 db 与核心数据相比很好,但我被困在一个地方,如下所示:

我有两个 RLMObject 用于创建关系,我想在其上运行连接查询(子查询),但我不能这样做。


Ralm 中的第一个对象(表格)

class Dog : RLMObject
{
    dynamic var name = ""
    dynamic var age = 0

    // create variable of Owner object 
    dynamic var owner = RLMArray(objectClassName: "Owner")

    override class func primaryKey() -> String!{
        return "name"
    }
}

Ralm 中的第二个对象(表格)

class Owner : RLMObject{
    dynamic var myName = ""
}

所以我只想获取属于所有者名称“ram”的那些狗名称 我尝试了以下子查询

var dog = Dog.allObjects().objectsWithPredicate(NSPredicate(format:"SUBQUERY(Owner, $owner, $owner.myName = 'ram')", argumentArray: nil))

但应用程序因以下错误而崩溃

RealTest[1701:17960] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "SUBQUERY(owner, $owner, $owner.myName = 'ram')"'

我也在网上搜索它,我发现了 realm.objects 但它给了我关于未找到的错误。

提前致谢!

【问题讨论】:

  • 您的案例中的关系似乎值得怀疑。一条狗可以有多个主人?
  • 是的,其实我现在才学境界。这就是我举这个例子的原因

标签: swift nspredicate realm


【解决方案1】:

您的谓词应如下所示:

let predicate = NSPredicate(format:"SUBQUERY(Owner, $owner, $owner.myName = 'ram') .@count > 0", argumentArray: nil)

这里的想法是确保在末尾添加.@ count > 0,因为谓词需要返回truefalse 才能工作。

【讨论】:

    【解决方案2】:

    这可以使用如下查询来实现:

    Dog.allObjects().objectsWhere("ANY owner.myName = 'ram'")
    

    SUBQUERY 仅在您对关系的目标有多个必须由单行满足的约束时才需要,或者如果您希望表达除ANY / ALL / @987654326 之外的约束@ 匹配的行数。

    也就是说,从 Realm Objective-C and Swift 0.98.0 开始,现在支持 SUBQUERY

    【讨论】:

      【解决方案3】:

      虽然 Realm 支持通过 NSPredicate 过滤对象,但在撰写本文时,Realm 对 NSPredicate 的实现仍支持原生 Apple 框架所做的每一种关键字类型,包括 SUBQUERY。 Realm 在其网站上提供了一个NSPredicate cheat sheet,概述了它目前支持的查询类型。

      话虽如此,如果此时您已经有一个Owner 对象,您实际上可以在Owner 对象([RLMObject linkingObjectsOfClass:forProperty:])上使用另一个Realm 方法来找出哪些Dog 对象正在引用它。

      最后,realm.objects 错误是因为该语法来自 Realm 的原生 Swift 版本,而您在这里使用的代码是 Realm 的 Objective-C 版本,桥接到 Swift。

      如果您需要更多说明,请告诉我!

      【讨论】:

      • 谢谢。 1. 你能给我这个查询以便更好地理解吗? 2. 我已经下载了 swift realm 版本,然后为什么它在 realm.objects 上给我错误。如果您知道任何适当的文档/网站可以在 swift 中实现领域(没有objective-c),请将这些链接发送给我。谢谢
      • 没问题!在这种情况下,我相信它会是let dogs = owner.linkingObjectsOfClass("Dog", forProperty:"owner")。 Realm Swift 的所有文档都可以在以下位置获得:realm.io/docs/swift/latest
      • 我对这个版本的objective-c bridge 和native swift 感到困惑。所以哪个查询给了我它将支持的地方。或者更好的方法是我删除我的 Objective-C 桥代码和旧的真实框架并下载新的 Swift 本机领域框架版本。 0.95.2 ?
      • 目前,任何版本的 Realm 都不支持 SUBQUERY。对不起!
      • 那么我将如何做到这一点。有没有其他方法可以做到这一点(子查询任务)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2020-10-04
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多