Realm谓词查询疑问:如何筛选含指定RString的Patient对象
你的写法无法实现需求,正确的查询方式看这里
首先直接给结论:你当前的写法不能实现想要的筛选效果,问题主要出在语法错误和查询逻辑的误解上,下面给你拆解问题并给出正确的实现方式。
为什么你的写法不对?
@%是错误的占位符语法,Realm使用的NSPredicate里正确的占位符是%@,但即使改成%@,直接传入RString(stringValue: 'test')也没用——因为你新创建的这个RString实例并没有被持久化到Realm数据库中,Realm无法把它和已存储的list中的对象匹配,而且我们的目标是匹配属性值,不是对象本身。- 你要筛选的是
list中存在某个子对象的属性等于特定值,这种场景需要用Realm谓词的集合匹配语法,而不是直接传对象。
正确的实现方式
硬编码值的写法
如果你只是固定要筛选name为name1且list中存在stringValue等于test的Patient,可以直接这样写:
patients = realm?.objects(Patient.self).filter("name = 'name1' AND ANY list.stringValue == 'test'")
这里的ANY关键字表示:只要list这个集合里有任意一个元素满足stringValue == 'test',就符合筛选条件。
动态传值的写法(更推荐)
如果name和目标stringValue是动态变量,用占位符%@来传值会更安全,避免字符串拼接的错误:
let targetName = "name1" let targetString = "test" patients = realm?.objects(Patient.self).filter("name = %@ AND ANY list.stringValue == %@", targetName, targetString)
补充说明
如果你的需求是所有list中的元素的stringValue都等于test,可以把ANY换成ALL;如果要匹配多个值,还可以用IN关键字,比如list.stringValue IN %@然后传入一个字符串数组。
内容的提问来源于stack exchange,提问作者Anya Alstreim
相关产品推荐
相关产品推荐

