【问题标题】:Return unique/distinct values with Realm query使用 Realm 查询返回唯一/不同的值
【发布时间】:2015-05-14 19:04:44
【问题描述】:

我有一个 Message/RLMObject 模型,它有一个 NSString *jabberID 属性/行,我想检索该行内的每个 unique 值。

换句话说,我想从我的Message 模型中检索非重复的jabberID 值。任何人都可以帮助解决这个问题吗?

我使用 coredata 的方式是在 NSFetchRequest 上使用 returnsDistinctResults 设置。

【问题讨论】:

    标签: ios objective-c swift realm


    【解决方案1】:

    自 Swift 以来的函数式编程方法,以及 Realm 延迟加载;在 Objective-C 中没有那么简单/可用的解决方案,但至少对于 Swift 来说: 斯威夫特

    let distinctTypes = reduce(Realm().objects(User), []) { $0 + (!contains($0, $1.type) ? [$1.type] : [] ) }
    

    更新:

    Swift reduce 是一种性能密集型,分配一堆中间数组,而不是以下应该在性能方面更好,但必须显式转换

    let distinctTypes = Array(Set(Realm().objects(User).valueForKey("type") as! [String]))
    

    【讨论】:

      【解决方案2】:

      我发现 Realm 还不完全支持不同的查询。好消息是我也找到了解决方法,在这个github issue

      Objective-c

      RLMResults *messages = [Message allObjects];
      NSMutableArray *uniqueIDs = [[NSMutableArray alloc] init];
      NSMutableArray *uniqueMessages  = [[NSMutableArray alloc] init];
      for (Message *msg in messages) {
          NSString *jabberID = msg.jabberID;
          Message *uniqueMSG = (Message *)msg;
          if (![uniqueIDs containsObject:jabberID]) {
              [uniqueMessages addObject:uniqueMSG];
              [uniqueIDs addObject:jabberID];
          }
      }
      

      Swift 3.0

      let realm = try! Realm()
      let distinctIDs = Set(realm.objects(Message.self).value(forKey: "jabberID") as! [String])
      var distinctMessages = [Message]()
      for jabberID in distinctIDs {
          if let message = realm.objects(Message.self).filter("jabberID = '\(jabberID)'").first {
              distinctMessages.append(message)
          }
      }
      

      【讨论】:

      • allObjects 是否返回 Results 集合?
      • 是的,它将返回所有对象的结果集合。
      • 我明白了,那么这种方法将失去来自Results 的惰性评估。
      • 你应该使用一个集合来检查成员,更快
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2020-11-13
      • 2020-09-09
      • 2015-03-25
      相关资源
      最近更新 更多