我的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”的标记?
非常感谢任何帮助。
答案 0 :(得分:3)
使用谓词使用Realm无法实现目标,因为Realm使用 let rangeStart = self.objects.count
let rangeEnd = rangeStart + (objects.count - 1)
for i in rangeStart...rangeEnd {
indexPaths.append(IndexPath(row: i, section: 0))
}
有很多限制并且缺少处理计算属性的能力但你可以使用这种方式作为workarround
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())})
我们获取tags数组并将其转换为字符串数组然后我们对字符串数组进行排序(这将确保只关注数组中的TAGS而不是顺序),之后我们将String中的排序数组转换为您的tags.tagName数组为[“B”,“A”,“C”],之后您将获得“ABC”作为STRING
之后我们检查STRING是否包含你的filterList.sorted()。joined()与之前解释过的相同的过程
所以,如果您的filterList有[“B”,“C”,“A”],您将获得“ABC”
我们检查“ABC”是否包含“ABC”,如果是,则包含在最终结果中