CoreData使用NSPredicate(swift)有条件地获取NSDate

时间:2015-07-14 04:01:23

标签: ios swift core-data nsdate nspredicate

基本上我有一个名为TimeLoc的实体,它有三个属性:时间,纬度和经度。它们的类型分别是Date,Double和Double。当我试图在属性时间使用过滤器发出请求时,我陷入了困境。

这是我的代码:

...
var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
var context: NSManagedObjectContext = self.managedObjectContext!
var request = NSFetchRequest(entityName: "TimeLoc")
var endTime = NSDate()
var startTime = NSDate(timeIntervalSinceNow: -65)
let predicate = NSPredicate(format: "time>= \(startTime) AND time<= \(endTime)")
request.predicate = predicate
var results: NSArray = context.executeFetchRequest(request, error: nil)!
...

我收到以下错误: '无法解析格式字符串“time&gt; = 2015-07-14 03:24:03 +0000 AND time&lt; = 2015-07-14 03:25:08 +0000”'

我该如何解决这个问题?我搜索了一下,但我发现的所有解决方案都在Objective-C中。如果有人能在斯威夫特回答我,那就太棒了。

编辑:正如V-Xtreme建议的那样,在Glauco Neves对this question

的回答中可以找到这个问题的答案。

2 个答案:

答案 0 :(得分:0)

我猜你是以NSDate格式向谓词发送参数:

let predicate = NSPredicate(format: "time>= \(startTime) AND time<= \(endTime)")

这里你的startTime和endTime是NSDate类型。尝试以String格式转换它并将其传递给谓词。它应该工作。

参考:NSPredicate: filtering objects by day of NSDate property

答案 1 :(得分:0)

虽然它具有直观意义,但已接受的解决方案并不适用于我。作为替代方案,我创建了一个谓词,因此搜索范围,如下:

"%K BETWEEN {%@, %@}"其中%K是我的关键路径,两个%@是我的开始和结束日期。

let datePredicate = NSPredicate(format: "%K BETWEEN {%@, %@}", argumentArray: [#keyPath(Activity.startTime), startDate!.startOfDay, endDate!.endOfDay])