我的Realm对象中有此属性
var tags = List<Tag>() "tags": [ { "tagId": "80069", "tagName": "A" }, { "tagId": "80070", "tagName": "B" }, { "tagId": "80071", "tagName": "C" }, { "tagId": "80073", "tagName": "D" } ]
我有一个可以过滤掉标签的视图控制器。
所以我有几个按钮来切换过滤器。我所做的是为每个按钮的过滤器创建一个数组
var filteredList = [String]()
因此,如果我单击按钮A,它将把“ A”追加到filteredList数组,如果我单击按钮B,它将把“ B”追加到filteredList数组,依此类推
目前这是我的过滤谓词
let realmFilteredList = self.realm.objects(MyDTO.self).filter("ANY tags.tagName IN %@", self.filteredList)
但是,上述谓词给我的结果是错误的,因为如果我想过滤属性为“ A,B,C,D”(精确的ABCD)的标签,它将返回给我其他包含A,B,C的标签,或D。
如何在我的搜索谓词中获得带有精确“ A,B,C,D”的标签?
给予的任何帮助都将受到高度赞赏。
使用Realm谓词无法实现目标,因为Realm使用时有很多限制,Predicates并且缺少处理计算属性的能力,但是您可以将这种方式用作工作环境
Predicates
let filterList = ["A","B"] let realmList = realmInstance?.objects(MyDTO.self) let filteredArray = Array(realmList!).filter({Array($0.tags).map({$0.tagName}).sorted().joined().contains(filterList.sorted().joined())})
在这里,Array($0.tags).map({$0.tagName}).sorted().joined()我们得到了标签数组,并使用map将其转换为字符串数组,然后对字符串数组进行排序(这将确保仅关系数组中的TAGS而不是顺序),然后将已排序的数组转换为字符串例如,您的tag.tagName数组是[“ B”,“ A”,“ C”],此后,您将获得“ ABC”作为STRING
Array($0.tags).map({$0.tagName}).sorted().joined()
之后,我们检查STRING是否包含您的filterList.sorted()。joined(),该过程与之前说明的相同
因此,如果您的filterList具有[“ B”,“ C”,“ A”],您将获得“ ABC”
并且我们检查“ ABC”是否包含“ ABC”(如果有的话)是否包含在最终结果中