You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:43:10