【问题标题】:Filter NSFetchedResultsController for nil value?过滤 NSFetchedResultsController 以获得零值?
【发布时间】:2010-11-07 10:35:05
【问题描述】:

我有一个NSFetchedResultsController,它正在从NSManagedObjectContext 获取对象。

这些对象有一个lastOpened 属性,最初是nil,并且仅在查看它们时设置。

我希望我的UITableView 显示最近打开的对象的列表,我可以通过将NSSortDescriptor 添加到NSFetchRequest 来实现。

问题:

我不想显示从未研究过的对象。 (lastOpened == nil) 我可以通过相同的NSFetchRequest 对其进行排序吗?有没有更好的方法来过滤数据?

谢谢。

【问题讨论】:

    标签: iphone cocoa cocoa-touch core-data


    【解决方案1】:

    试试这个:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"lastOpened != nil"];
    ... // add sort descriptors etc.
    

    然后将获取请求添加到NSFetchResultsController

    【讨论】:

      【解决方案2】:

      当然。您正在寻找的是NSPredicate。基本上,它允许您指定希望获取的对象满足的一个或多个条件,然后仅获取与这些条件匹配的对象。

      但是,构建谓词是一个有点棘手的命题 - 您可能需要查看 Predicate Format String Syntax 指南以开始使用。 对于您的特定情况,它甚至更棘手,因为我不确定在谓词术语中是否存在 nil 值的表示。但是,您可以通过使用遥远过去的某个日期来解决这个问题:

      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened > %@",
                                [NSDate dateWithTimeIntervalSince1970:0]];

      您可以直接在谓词中检查 nil:

      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastOpened != nil"];

      这将创建一个谓词,该谓词只允许返回具有设定日期(1970 年 1 月 1 日之后的任何日期)的对象。然后在执行之前将谓词添加到 fetch 请求中:

      // Assuming you have some almost-ready NSFetchRequest *request:
      [request setPredicate:predicate];

      【讨论】:

      • 这太棒了。我有预感涉及谓词。谢谢!
      【解决方案3】:

      对于 Swift,您可以使用布尔值初始化 NSPredicate 以始终返回 true,这实际上是一个不过滤任何内容的过滤器

      return fetchedResultsController("Terminal", withFilter: NSPredicate(value: true), sortColumns: sortColumns, sortDirections: sortDirections)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多