【问题标题】:What's the simplest yet efficient way to check for duplicates in a realm Results<>?检查领域结果<>中重复项的最简单但有效的方法是什么?
【发布时间】:2016-06-01 06:45:59
【问题描述】:

我正在尝试列出用户可以添加到事件中的联系人,但我想过滤结果以便不显示重复项。因此,如果我添加 John Doe,他的联系人将不会出现在联系人列表中。我不太熟悉 NSPredicate,所以我不确定这是否是最好的方法,或者将结果数组转换为更容易使用的东西。

【问题讨论】:

  • 如果您不想重复结果,为什么不使用 primaryKey 保存和更新模型?
  • 我将结果转换为一组,然后使用exclusiveOrInPlace 从保存的事件中删除一组以前使用过的联系人。我有 3 组要添加的联系人、以前的联系人和结果组。这应该是效率问题吗?

标签: ios swift nspredicate realm


【解决方案1】:

这是关于 kotlin 的示例,但非常接近 swift。 你可以做这样的事情。您可以获取按名称过滤的用户列表,而不是获取 RealmResults。

fun filteredUsers(){
    val realm = Realm.getDefaultInstance()
    realm.where(UserRealm::class.java)
        .findAllAsync()
        .asObservable()
        .filter { users -> users.isLoaded }
        .flatMap { users -> Observable.from(users) }
        .filter { user -> !user.name.equals("John Doe") }
        .observeOn(AndroidSchedulers.mainThread())
        .doOnError { err -> err.printStackTrace() }
        .toList()
        .subscribe { userList -> print(userList) }
}

而且我还在文档中发现了更简单的 swift 方法:

// Query using a predicate string
var tanDogs = realm.objects(Dog).filter("color = 'tan' AND name   BEGINSWITH 'B'")

// Query using an NSPredicate
let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "tan", "B")
tanDogs = realm.objects(Dog).filter(predicate)

【讨论】:

    【解决方案2】:

    您想要一个不同的查询,但 Realm doesn't support them natively yet

    但是,您可以从 Realm 中获取数据并自己进行重复数据删除,但是您会丢失 Realm 的自动更新 Results 类型:

    let realm = try! Realm()
    let currentUser = realm.objects(User).filter("me == true").first!
    let uniqueContactNames = Set(currentUser.contacts.valueForKey("name") as! [String])
    

    有关更多详细信息和建议的解决方法,请参阅#1103

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 2012-05-20
      • 2013-07-04
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多