【问题标题】:NSpredicate one child item per parentNSpredicate 每个父项一个子项
【发布时间】:2016-11-14 09:48:54
【问题描述】:

我正在使用 Realm 将所有数据存储在我的应用程序中。

我有一个商店商品,其中包含促销 id 列表和促销,其父属性是商店的 id。

我现在过滤所有可用的促销活动,并且我想再添加一个过滤器,以便结果列表中每个商店只包含一个促销活动。

我怎样才能完成过滤,这样我每家商店只能获得一个可用的促销活动?

谢谢! // 金

//编辑

let startDate: Double = currentDate.timeIntervalSince1970
let endDate: Double = currentDate.timeIntervalSince1970 

let parentPredicate = NSPredicate(format: "") 
let datePredicate = NSPredicate(format: "SUBQUERY(dates, $d, $d.start <= \(startDate) && $d.end >= \(endDate)).@count > 0")

self.realm?.objects(CSPromotions.self).filter(datePredicate).filter(parentPredicate)

【问题讨论】:

  • 您可以使用 AND 运算符来连接多个过滤器。 let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "tan", "B")。请按照文档realm.io/docs/swift/latest/#filtering
  • 我知道这一点,但是如何过滤掉所有具有相同父级的促销活动,因此每个父级只有一个促销活动?如何编写谓词查询?
  • 你能分享你的代码吗?我的意思是你已经尝试过什么?没有代码很难给你建议。
  • 我已经在上面添加了我的代码。我还没想好怎么解决。因此,如果我得到所有有效的促销,同一家商店可以在该结果中有 5 次促销。我想过滤掉其中的4个,所以只有一个。我可以在谓词中使用它,因为它比在列表上进行过滤要快。
  • 如果你想根据父let parentPredicate = NSPredicate(format: "parentid = %@ ", relamobject.parentid)过滤促销,我认为应该是这样的

标签: ios swift realm nspredicate


【解决方案1】:

Realm Swift currently doesn't natively support distinct,所以没有什么好方法可以做到这一点。您可以做的是手动构建一个不同值的数组:

let shops = NSMutableSet()
let promotions = self.realm?.objects(CSPromotions.self).filter(datePredicate).filter(parentPredicate).filter {
    let id = $0.shop.id
    if shops.contains(id) {
        return false
    }
    shops.add(id)
    return true
}

【讨论】:

  • 非常感谢您的回答! :)
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多