核心数据谓词根据日期属性过滤对象

Posted

技术标签:

【中文标题】核心数据谓词根据日期属性过滤对象【英文标题】:Core Data predicate to filter objects depending on a date attribute 【发布时间】:2015-05-28 18:41:11 【问题描述】:

我是 Swift 新手,我的问题还没有找到任何答案。

我有一个具有多个属性的核心数据实体。该应用程序应管理待办事项列表。其中一个属性是 Date 属性,当对象必须完成时,我会在其中存储时间戳

我知道日期是按以下格式存储的:

2015-05-28 18:22:08 +0000

在视图控制器中,我需要根据到期日期和时间的日期值计算核心数据对象。

需要的部分是: - 今天截止日期的任务 - 明天截止的任务 - 截止日期在明天或更晚的任务 - 逾期的任务 - 没有日期的任务

我在哪里可以找到执行所需谓词的方法?

这是我当前的代码,其中我得到日期大于当前日期的对象数:

func getFetchedResultController(selectedEntity: NSString)

    let appDelegate : AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedObjectContext: NSManagedObjectContext = appDelegate.managedObjectContext!

    let fetchRequest = NSFetchRequest()

    let entity = NSEntityDescription.entityForName(selectedEntity as String, inManagedObjectContext: managedObjectContext)

    fetchRequest.entity = entity

    fetchRequest.fetchBatchSize = 20
     let date = NSDate()

    let predicate = NSPredicate(format: "timeStamp > %@", date)
    fetchRequest.predicate = predicate

    let sectionSortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: true)
    let sortDescriptors = [sectionSortDescriptor]
    fetchRequest.sortDescriptors = sortDescriptors

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

    aFetchedResultsController.delegate = self
    self.fetchedResultsController = aFetchedResultsController

    var error: NSError? = nil
    if !self.fetchedResultsController.performFetch(&error) 
        abort()
    

 print(fetchedResultsController.fetchedObjects?.count ?? 0)

【问题讨论】:

你的意思是这样的:***.com/questions/21222361/…,但是使用 Swift 吗? @MartinR,感谢您的研究。我正在开发一个类似的应用程序,但使用的是 Swift。在这种情况下,我不是在谈论表格视图。我不知道使用日期组件而不是使用 NSDate 值来存储到期日期是否更容易,以便更轻松地创建谓词... 您谈到了“部分”,因此我假设您想在表格视图中显示数据。此外 NSFetchedResultsController 几乎只与表格视图一起使用。 @MartinR,再次感谢您。我谈到了“部分”,但我并不是指表格视图部分。视图控制器必须显示按钮,一个按钮旨在显示每种类型的对象数量(今天的任务、明天的任务等)。这就是为什么我需要每种类型的对象数量。 上面的代码是否按原样工作以获取具有 timeStamp > date 的对象,而您也只需要其他谓词?还是上面的代码不起作用? 【参考方案1】:

我已经实现了如下。

    向实体添加一个属性。 (字符串类型的sectionIdentifier) 在插入数据时将日期值设置为属性“sectionIdentifier”。

    将部分标识符添加到 FRC 我正在发布示例 sn-p,如下所示

    func getFetchedResultController(selectedEntity: NSString)
    
    let appDelegate : AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedObjectContext: NSManagedObjectContext = appDelegate.managedObjectContext!
    
    
    let fetchRequest: NSFetchRequest<EntityNameHere> = EntityNameHere.fetchRequest()
        fetchRequest.fetchBatchSize = 20
    
        let sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
        fetchRequest.sortDescriptors = [sortDescriptor]
    
    
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: “sectionIdentifier”, cacheName: “Root”)
    
    aFetchedResultsController.delegate = self
    self.fetchedResultsController = aFetchedResultsController
    
    var error: NSError? = nil
    if !self.fetchedResultsController.performFetch(&error) 
        abort()
    
    

    print(fetchedResultsController.fetchedObjects?.count ?? 0)

4.在 TableView 部分回调之一中获取部分信息。

 let sectionInfo = self.fetchedResultsController.sections! as [NSFetchedResultsSectionInfo]
 let recivedDate = sectionInfo[section].name

5.这将返回具有不同日期的日期部分。

【讨论】:

以上是关于核心数据谓词根据日期属性过滤对象的主要内容,如果未能解决你的问题,请参考以下文章

Xcode:使用复杂谓词过滤核心数据集

核心数据中的谓词和组合过滤器?

通过属性过滤掉相似对象的谓词

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

在数组控制器上使用谓词过滤相关对象

如何根据 nsarray 过滤谓词