【问题标题】: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)
}

【问题讨论】:

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

标签: ios swift core-data


【解决方案1】:

我已经实现了如下。

  1. 向实体添加一个属性。 (字符串类型的sectionIdentifier)
  2. 在插入数据时将日期值设置为属性“sectionIdentifier”。
  3. 将部分标识符添加到 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.这将返回具有不同日期的日期部分。

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2018-09-27
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多