检查领域中重复项的最简单有效的方法是什么结果<>?

时间:2016-06-01 06:45:59

标签: ios swift nspredicate realm

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

2 个答案:

答案 0 :(得分:0)

这是关于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) }
}

而且我在docs中找到了更简单的快捷方式:

// 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)

答案 1 :(得分:0)

您需要一个独特的查询,但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