swift - 使用 Realm Swift 进行 NSPredicate 过滤

标签 swift realm filtering nspredicate

我在弄清楚如何使用 Realm 将普通的快速过滤代码转换为 NSPredicate 查询时遇到了一些麻烦。我已经提供了数据结构的简化示例。我的目标是找出设备上的哪些用户联系人已为我的应用程序注册。

class User: Object {

    let contacts = List<Contact>()

}

class Contact: Object {

    let numbers = List<String>()

}

每个用户对象都包含一个“联系人”列表,其中是当前存储在用户设备上的所有联系人。每个“联系人”对象都有一个“号码”列表,因为每个联系人可以有多个电话号码。

在常规 swift 代码中,确定哪些用户联系人已经为我的应用注册,如下所示:

func alreadyRegistertedUserContacts(_ contacts: Results<Contact>,
                                    allUsers: Results<User>) -> [Contact] {
    return contacts.filter { (contact) -> Bool in
        return contact.numbers.contains(where: { (number) -> Bool in
            return allUsers.contains(where: { (user) -> Bool in
                return user.phoneNumber == number
            })
        })
    }
}

所以问题是,为了提高效率,我如何更改此函数以使用 NSPredicates?

预先感谢您的帮助!

最佳答案

Realm 目前不支持在其谓词中使用类型为基元列表的属性。在解除该限制之前,无法单独使用 NSPredicate 来过滤对象。

如果您愿意像这样更改模型:

class StringObject: Object {
    @objc dynamic var string = ""
}

class Contact: Object {
    let numbers = List<StringObject>()
}

class User: Object {
    let contacts = List<Contact>()
}

这应该允许您像这样执行过滤:

return contacts.filter("ANY numbers.value IN %@",
                       allUsers.flatMap { return $0.phoneNumber })

关于swift - 使用 Realm Swift 进行 NSPredicate 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253891/

相关文章:

革命 R : filter an xdf using another xdf

ios - 如何保存多个按钮选择?

json - 无法将 API-Response 转换为 JSON,但可以将其打印为字符串

ios - AVAudioEngine 和 AVAudioSession 之间有什么关系吗?

javascript - 如何从数组中删除数值和空值?

WPF ICollectionView 过滤

swift - 如果在文本字段中写入 200 我想在标签中打印 ok

java - 安装 Project Lombok 后处理 RealmObject 后代时出错

.net - 无法使用 .net sdk 在 Realm 中离线工作

ios - 使用多点连接发送数据库/Realm