【问题标题】:How do I do this NSPredicate code?我该如何做这个 NSPredicate 代码?
【发布时间】:2012-06-12 20:00:00
【问题描述】:

我在使用 NSPredicate 时遇到问题。我有一个名为 Entry 的核心数据对象,其中包含一个名为 creationDate 的 NSDate。我想将此与我称为日期的变量进行比较。

我使用 NSDate 类别来提取两个对象的单独年份,并使用核心数据类别来对我的核心数据存储中的所有 Entry 对象执行谓词。

[Entry allForPredicate:[NSPredicate predicateWithFormat:@"creationDate.year == %i",  date.year]];

我认为这是错误的,因为它没有给我预期的结果,而是显示为空白。

我哪里错了?

【问题讨论】:

    标签: objective-c ios cocoa-touch core-data nspredicate


    【解决方案1】:

    我怀疑,Core Data 在创建原始数据库调用时是否可以合并类别。

    为您的案例创建 2 个日期,一个是今年 1 月 1 日 0:00 和一年后

     NSString *basePredicateString = @"creationDate >= %@ AND creationDate < %@";
     NSPredicate *predicate = [NSPredicate predicateWithFormat:basePredicateString, startDate, endDate];
    

    为了完整起见——我将如何生成实际年份的开始和结束日期:

    NSDate *startDate = [NSDate date];
    [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDate interval:NULL forDate:startDate];
    
    NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
    comps.year = 1;
    NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:startDate options:0];
    

    在这个答案下面的 cmets 中,jbrennan 提出,确实可以将一个类别合并到一个谓词中。虽然他适合作为 NSArrays 的集合(他添加了一个测试项目的链接),但它在 Core Data 获取请求时不起作用——至少我不能让它起作用。我试过了。这是我的测试:https://github.com/vikingosegundo/CoreDataCategoryTest

    【讨论】:

    • 我很确定它可以合并类别方法。至少,在使用NSFetchedResultsControllerNSDate 上的类别方法时,我几乎完全做到了这一点。
    • 谓词将跟随使用点的对象的键路径,所以只要类别有-key,那么date.key就会计算。
    • 您正在使用带有普通数组的谓词 - 但它是否适用于核心数据?
    • 无论如何——我该睡觉了,我的城市已经苏醒了。我明天试试。
    【解决方案2】:

    @vikingosegundo 有正确的答案 - 您不能在谓词中使用类别。

    如果您了解 SQL,请尝试设置以下“启动时传递的参数”:

    -com.apple.CoreData.SQLDebug 1

    这将允许您查看请求生成的 SQL。这应该可以帮助您了解您编写的谓词是如何转换为 SQL 的。


    编辑再次根据@vikingosegundo - 以上适用于根据OP的问题与CoreData一起使用时。

    【讨论】:

      猜你喜欢
      • 2020-05-24
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2016-04-18
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多