【问题标题】:Realm subquery with List count in SwiftSwift中具有列表计数的领域子查询
【发布时间】:2016-02-01 05:38:05
【问题描述】:

我有

class Car : Object
{
     let queries : List<QueryModel> = List<QueryModel>()
}

class QueryModel : Object
{
    let location : String = ""
}

现在我该如何编写 NSPredicate 来获取查询位置等于“伦敦”的汽车?

附言众所周知,@count 之类的东西不适用于 Swift List 类...

p.p.s.我需要它作为谓词,因为这是 RBQFetchedResultsController 知道如何完成它的工作的唯一方法。

我认为它可以写成NSPredicate(format: "SUBQUERY(queries, $query, $query.location == %@)", 'London')。但是这样的事情从来没有通过 Realm 的谓词验证 :)

【问题讨论】:

  • 你确定@count - 我知道它从0.96版开始工作。
  • 据我了解,它很可能有效,但仅适用于 ObjC 的东西。它不适用于 List ,它是 Realm 集合的 Swift 等价物。

标签: ios swift nspredicate realm


【解决方案1】:

你可以写

NSPredicate(format: "ANY queries.location = %@", locationString)

如果要添加其他过滤,可以创建其他 NSPredicate 然后使用

NSCompoundPredicate(andPredicateWithSubpredicates: [pred1, pred2])

组合过滤器。

现在,如果你想过滤汽车,你必须准备一个

let request = FetchRequest<Car>(realm: realm, predicate: predicate)

然后你可以使用 RBQFetchedResultsController 来执行请求。

【讨论】:

  • 我自己没有测试 Compound,但我读到它也可以与 Realm 一起使用。 qiita.com/yusuga/items/add6f9e290b92f42104a(虽然很抱歉,但在日语中)我还读到没有子谓词的 NSCompoundPredicate 总是评估为 true,但我认为它在这里甚至不相关。在您的具体情况下,您显然只需要 1 个 NSPredicate 。如果可以的话,尽管试一试。只是为了 100% 确定 NSCompoundPredicate 也可以正常工作。您可以将 2 个谓词与 NSPredicate(格式:“%K contains[c] %@”、“Car.location”、“on”)和“Lon”结合起来
  • 不,不幸的是它会抱怨。无论如何,这里的问题是您的第一个谓词仍然需要检查未在 Obj.C 上设置的“计数”属性。实例,因此无法找到。
  • 不仅如此。关键路径是 car.queries[index].location
  • Realm 支持复合谓词。 @Fawkes:据我了解,@Mikael 的建议就是您想要的。如果你使用ANY,我看不出你需要@count
  • 啊,是的。这是关于块谓词的。我整个晚上都在围绕着Realm。我会检查解决方案,希望 ANY 不会遇到与 @count 相同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多