【问题标题】:Swift Realm filter List property using an Array使用数组的 Swift Realm 过滤器列表属性
【发布时间】:2018-03-15 08:13:37
【问题描述】:

我的领域对象中有这个属性

 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”附加到过滤列表数组,如果我单击按钮 B,它将附加“B”到过滤列表数组,依此类推

目前这是我的过滤谓词

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”的标签?

非常感谢您提供的任何帮助。

【问题讨论】:

  • 您是否要过滤您的MyDTO 对象内的标签列表的结果?
  • 您的标签订单是否相关?我的意思是 ABCD 和 BCDA 一样吗?
  • 好吧,Realm 在使用 Predicates 时有很多限制,但如果您有兴趣,可以使用变通方法使其工作,让我知道我已经为此完成了一个可行的解决方案
  • @ReinierMelian 您好,订单没有问题。只要 self.filteredLitst = ['A','B','C','D'] 将返回也包含精确 ['B','A','C','D'] 的领域结果也可以接受:)。只要4个过滤标签相同

标签: ios iphone swift realm


【解决方案1】:

您无法通过 Realm 使用谓词来实现您的目标,因为 Realm 在使用 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 将其转换为字符串数组,然后我们对该字符串数组进行排序(这将确保只关心数组中的标签而不是顺序),然​​后我们转换例如,在 String 中排序的数组,您的 tags.tagName 数组是 ["B","A","C"] ,之后您将获得 "ABC" 作为 STRING

之后,我们检查该 STRING 是否包含您的 filterList.sorted().joined() 与之前解释的相同过程

所以如果你的 filterList 有 ["B","C","A"] 你会得到 "ABC"

我们检查“ABC”是否包含“ABC”,如果是,则包含在最终结果中

【讨论】:

  • 先生,非常感谢您,它确实有效!这就是我要找的。你是救生员!顺便说一句,先生,您能详细说明您在那里做了什么吗?因为我想了解那里发生了什么:)
  • 好的,我会在这个@Alvin 上添加进一步的解释
  • 非常感谢先生!我非常感谢您所做的一切!
  • 如果我需要结果类型怎么办?
  • 它在大数据上使用了这么多 CPU
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多