核心数据NSPredicate使用属于任意日期或日期范围的NSDate属性获取对象

时间:2015-08-10 21:34:15

标签: core-data nsdate nspredicate nsfetchrequest

我正在寻求有关特定核心数据谓词的帮助(如果可以通过单次提取来处理此问题)。

我有几个具有.date属性的对象(NSDate)。平均而言,特定日期约有4-20个对象。如果愿意,可以考虑日记帐分录。

[Journal]
-date: NSDate

e.g:

J1:[“date”:“2015-08-10 9:00”],

J2:[“date”:“2015-08-10 14:00”],

J3:[“date”:“2015-08-10 18:00”],

J4:[“date”:“2015-08-09 9:00”],

J5:[“date”:“2015-08-09 13:00”],

...

我想根据最后一个条目的日期执行几次提取(不知道实际上是什么时候):

1:获取最后一天发生的所有日记帐分录。

2:获取上周发生的所有日记帐分录

3:获取上个月发生的所有日记帐分录

我正在使用异步获取请求来获取对象:

context.performBlock() {
            let fetchRequest = NSFetchRequest(entityName: "Journal")
            fetchRequest.predicate = self.page?.predicate

            let asyncFetchRequest = NSAsynchronousFetchRequest(fetchRequest: fetchRequest) { (result) in
                if result.finalResult?.count > 0 {
                    println("we are done with our async fetch")

                }

                completion?(result.finalResult as? [Journal])
            }

            var fetchError: NSError?
            let fetchResult = context.executeRequest(asyncFetchRequest, error: &fetchError) as! NSAsynchronousFetchResult
        }

在视图控制器的didLoad方法上调用此方法。视图控制器由UIPageViewController管理。

我找不到允许我获取最大日期加上所有相关日记条目的谓词。我目前的解决方法是获取最新的,在日期设置排序描述符并将结果限制为1(接收最大日期)。然后我运行第二个fetchRequest(从一天的开始到一天结束)。然而,这只是半最优的,我想知道是否有人知道更好的方式。

感谢您的帮助:

最好的, 罗恩

1 个答案:

答案 0 :(得分:0)

您可以搜索属于两个日期的所有实体:

"date > %@ and date < %@"

然后使用NSCalendar计算开始日期(即今天减去1天,7天等)。

日期存储为数字,因此搜索非常快,因为它是一个简单的数字比较。

BTW,没有理由使用异步提取来检索少量数据。如果您实际上只返回20个或更少的实体,请索引date属性,将日期放在谓词中,并且返回将很快。只有当你有一个痛苦的谓词搜索字符串等时才应该使用异步提取。