ios - 搜索 CoreData 以匹配 NSDate - Swift

标签 ios core-data swift nsdate nspredicate

我想搜索所有现有对象,看看 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/

相关文章:

ios - 与照片相关的警报不会调用 addUIInterruptionMonitor 的处理程序

ios - revealViewController() 总是返回 nil

ios - AudioQueueStart 在 iOS 7 的后台进程中失败并显示 -16981

iphone - 核心数据 : "Dangling reference to an invalid object." error

ios - 识别 iCloud coreData 更新 : good practice

ios - 将特定 Collection View 索引处的图像发送到另一个 View Controller 的问题

arrays - 如何使用循环在不使用 .reversed() 的情况下使用与语言相同的项目填充新数组?

ios - 无法在 Xcode 中编译 OpenCV

ios - MKMapView 叠加矢量瓦片

cocoa - 核心数据、托管对象上下文、NSArrayController..让我理顺一下