核心数据谓词根据日期属性过滤对象
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.这将返回具有不同日期的日期部分。
【讨论】:
以上是关于核心数据谓词根据日期属性过滤对象的主要内容,如果未能解决你的问题,请参考以下文章