【问题标题】:isSubsetOfSet in NSPredicate stringNSPredicate 字符串中的 isSubsetOfSet
【发布时间】:2014-11-12 16:15:52
【问题描述】:

我很难检查一个 nsorderedset 是否是 NSPredicate 字符串中另一个 nsorderedset 的子集。

我可以用下面的块实现结果:

request.predicate = [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary *bindings) {
    NSOrderedSet *biggerSet = [object valueForKey:@"attributeName"];
    return [smallerSet isSubsetOfOrderedSet:biggerSet];
}];

但我相信字符串格式可能会更高效(我错了吗?)。

尝试了@"attribute CONTAINS %@" 和@"%@ IN attribute" 之类的方法,但没有成功。

感谢您的帮助。

【问题讨论】:

    标签: core-data nspredicate nsset


    【解决方案1】:

    这样的事情应该可以工作:

    NS(Ordered)Set *smallerSet = …
    request.predicate =
      [NSPredicate predicateWithFormat:@"SUBQUERY(attribute, $a, $a IN %@).@count == %lu",
             smallerSet, (unsigned long)[smallerSet count]];
    

    谓词检查smallerSet 中包含的“属性”值的数量是否为 等于smallerSet 中的元素数。如果是,那么smallerSet 必须是 “属性”集的子集。

    基于字符串的谓词通常不会比基于块的谓词快(比较 https://stackoverflow.com/a/21158730/1187415)。但是一个核心数据获取请求(带有 SQlite 存储文件)不能使用基于块的谓词。

    【讨论】:

    • 在 SQL 数据存储中,我得到“子查询中不能有非关系集合元素”。我担心集合中的自定义对象有问题。但它覆盖了“isEqual”和“hash”。有什么想法吗?
    • 看起来自定义对象必须继承 NSManagedObject 并且可能通过关系连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2011-03-25
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多