代码之家  ›  专栏  ›  技术社区  ›  Massimo Cafaro

核心数据、nspredicate和to many键

  •  42
  • Massimo Cafaro  · 技术社区  · 17 年前

    我有一个核心数据模型,其中一个任务实体包括一个可选的到多个关系,排除了doccurrence。excludedoccurrences的一个属性是start,它是nsdate对象。excludedoccurrence实体与任务实体的一个关系具有反向强制关系。

    为了获取指定日期的任务,我需要确保指定日期不会显示为任何ExcludeDoccurrence实体的Start属性。因此,我尝试使用的子谓词之一是

    NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];
    

    其中,today是今天的nsdate对象,仅包括日、月和年组件。所有排除的事件开始属性也只包括日、月和年组件。

    虽然这样可以,但至少在阅读核心数据和nspredicate的文档时,我会收到以下错误消息:

    由于未捕获异常“nsInvalidArgumentException”,正在终止应用程序,原因:“不支持谓词”

    如果我使用等价谓词

    NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];
    

    不会引发异常,但是代码不能按预期工作:相反,不应排除今天发生的事件。

    我也不确定如何测试case excludedoccurrences==nil:以下谓词

    NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];
    

    在运行时导致异常

    这里不允许多个键

    但是,由于excludedoccurrences关系是可选的,所以我还需要测试它是否为零。

    我该怎么处理?提前谢谢。

    4 回复  |  直到 10 年前
        1
  •  109
  •   Ashley Clark    16 年前

    要测试空关系,您应该将to many键的计数与零进行比较。

    [NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];
    

    至于你的次级医学院,要知道你只能有一个 ALL ANY 最后一个谓词中的修饰符,尽管可以在整个谓词中多次使用该修饰符。

    不好 : ANY foo.bar = 1 AND ALL foo.baz = 2
    好啊: ANY foo.bar = 1 AND !(ANY foo.baz != 2)

        2
  •  28
  •   Massimo Cafaro    11 年前

    在大家的帮助下,我终于为我的场景确定了正确的谓词。 看起来nsdate对象是作为double处理的,但是double从来不像3.7,它总是像3.0。 因此,以下谓词在我的测试中正确工作:

    NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];
    

    其中thisdate是一个nsdate对象,只包含日、月和年组件(如excludedoccurrence实体的start属性)。

    正如苹果公司的一些人所建议的那样,对空关系的测试基本上是使用@count aggregate操作符完成的。

    再次感谢你的帮助。 我仍然注意到文档有几个部分有缺陷(特别是当它说所有的工作都很好,而实际上它根本不工作时)。

        3
  •  8
  •   Simon Woodside    16 年前

    因此,为了测试非空关系,这实际上是有效的:

    [NSPredicate predicateWithFormat:@"relationship.@count != 0"]
    

    阿什利·克拉克给出的解决方案对我来说是“很多钥匙在这里是不允许的”。

        4
  •  3
  •   Steve    10 年前

    在Swift2中,类似于:

    request.predicate = NSPredicate(format: " relationship.@count != 0")