我想搜索所有现有对象,看看 CoreData 中是否有任何匹配的日期对象:
日期当前通过 start_date 属性保存在我的 CoreData 中,格式如下:2013-08-29 14:27:47 +0000。
然后我让用户从 UIDatePicker 中选择一个日期并将 .date() 分配给变量 date。
例如我选择的日期 = 2013-08-29 17:34:23 +0000。
下面是我如何使用谓词搜索 CoreData。
let predicate = NSPredicate(format: "start_date contains[search] %@", date)
let request:NSFetchRequest = NSFetchRequest(entityName: "Project")
let sortDescriptor:NSSortDescriptor = NSSortDescriptor(key: "number", ascending: true)
let sortDescriptorsAry:NSArray = [sortDescriptor]
request.sortDescriptors = sortDescriptorsAry
request.predicate = predicate
return request
但是我没有得到任何结果。我假设这是因为两个属性因为时间不匹配:
start_date = 2013-08-29 14:27:47 +0000
date = 2013-08-29 17:34:23 +0000
我如何告诉 CoreData 忽略“177:34:23 +0000”位,或者有更好的方法吗?
编辑:
我确实可以选择更改最初存储日期格式的方式:
我试过这个:
var now:NSDate = self.startDatePicker.date
var calendar:NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
var components:NSDateComponents = calendar.components(NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay, fromDate: now)
components.hour = 00
components.minute = 00
components.second = 00
var newDate:NSDate = calendar.dateFromComponents(components)!
但是在某些日子里,我的时间被设置为前一天。 例如:
选择 8 月 30 日,转换后得到 2014-08-29 23:00:00 +0000
最佳答案
在 Core Data 中保存 start_date
属性之前,您需要确保它们的时间设置为 12:00 AM:
//Get "Aug 29, 2014, 12:00 AM" from "Aug 29, 2014, 10:07 PM"
let newDate = NSDate() //or any other date
let calendar = NSCalendar.currentCalendar()
calendar.timeZone = NSTimeZone.systemTimeZone()
var startDate: NSDate?
var duration: NSTimeInterval = 0
calendar.rangeOfUnit(.DayCalendarUnit, startDate: &startDate, interval: &duration, forDate: newDate)
//Create, set and save a new managedObject
//Records, here, is the name of your NSManagedObject subclass
let record = NSEntityDescription.insertNewObjectForEntityForName("Records", inManagedObjectContext: managedObjectContext) as Records
record.start_date = startDate
/* set other attributes here */
var error: NSError?
if !managedObjectContext.save(&error) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
println("Unresolved error \(error), \(error!.userInfo)")
abort()
}
然后,您将能够以这种方式使用您想要的谓词在 Core Data 中获取日期:
//Set your datePicker date to 12:00 AM
let pickerDate = dateFromMyDatePicker //as NSDate
let calendar = NSCalendar.currentCalendar()
calendar.timeZone = NSTimeZone.systemTimeZone()
var predicateDate: NSDate?
var duration: NSTimeInterval = 0
calendar.rangeOfUnit(.DayCalendarUnit, startDate: &predicateDate, interval: &duration, forDate: pickerDate)
//Create your fetchRequest
/* ... */
//Set your predicate
let predicate = NSPredicate(format: "start_date == %@", predicateDate)
编辑
作为 rangeOfUnit:startDate:interval:forDate:
的替代方法,您可以使用您提供的代码。但在这两种情况下,不要忘记添加以下行:
calendar.timeZone = NSTimeZone.systemTimeZone()
关于ios - 搜索 CoreData 以匹配 NSDate - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25570720/