使用核心数据获取两个日期之间的记录 ios swift
Fetch records between two dates using core data ios swift
我正在尝试搜索 swift 中两个日期之间的记录。
我正在存储日期,如下所示:
let date = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd HH':'mm':'ss"
println(date) // prints 2015-09-26 05:22:41 +0000
myreport.setValue(date, forKey: "date")
下面是我使用 NSPredicate 获取两个日期之间的记录的代码:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
let endDate:NSDate = dateFormatter.dateFromString(todate)!
println(fromdate) // prints 2015-09-22
println(todate) // prints 2015-09-29
println(startDate) // prints 2015-09-21 20:00:00 +0000
println(endDate) // prints 2015-09-28 20:00:00 +0000
let predicate1 = NSPredicate(format: "%@ >= date AND %@ <= date", argumentArray: [startDate, endDate])
let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicate1])
// Set the predicate on the fetch request
request.predicate = predicate
request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
var results : NSArray = context.executeFetchRequest(request, error: nil)!
注:
1) 我的开始日期和今天的格式为 2015-09-25(作为字符串)
2) 我在核心数据中日期属性的数据类型是 NSDate
3) 我能够成功地从核心数据中存储和获取日期
当我 运行 上面的代码时,我没有收到任何错误,但代码没有搜索两个日期之间的记录。我的意思是我得到的是空结果数组。
任何人都可以告诉我我在这里做错了什么。
另外请让我知道是否需要更多信息。提前致谢!
我认为您的谓词可能有误,请尝试修改为:
%@ <= date AND date <= %@
通过这种方式,您将看到 date
介于开始日期和结束日期之间。
经过多次修改和测试后,终于对我有用了,如下所示。如果您需要我如何将 nsdate 存储在 coredata 中,请检查上面的问题。
println(self.appdel.fromdate) // prints 2015-09-25
println(self.appdel.todate) // prints 2015-09-26
var fromdate = "\(self.appdel.fromdate) 00:00" // add hours and mins to fromdate
var todate = "\(self.appdel.todate) 23:59" // add hours and mins to todate
var context : NSManagedObjectContext = appdel.managedObjectContext!
var request = NSFetchRequest(entityName: "TblReportsP")
request.returnsObjectsAsFaults = false
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
dateFormatter.timeZone = NSTimeZone(name: "GMT") // this line resolved me the issue of getting one day less than the selected date
let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
let endDate:NSDate = dateFormatter.dateFromString(todate)!
request.predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", startDate, endDate)
request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
var results : NSArray = context.executeFetchRequest(request, error: nil)!
println(results.count)
我正在尝试搜索 swift 中两个日期之间的记录。 我正在存储日期,如下所示:
let date = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy'-'MM'-'dd HH':'mm':'ss"
println(date) // prints 2015-09-26 05:22:41 +0000
myreport.setValue(date, forKey: "date")
下面是我使用 NSPredicate 获取两个日期之间的记录的代码:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
let endDate:NSDate = dateFormatter.dateFromString(todate)!
println(fromdate) // prints 2015-09-22
println(todate) // prints 2015-09-29
println(startDate) // prints 2015-09-21 20:00:00 +0000
println(endDate) // prints 2015-09-28 20:00:00 +0000
let predicate1 = NSPredicate(format: "%@ >= date AND %@ <= date", argumentArray: [startDate, endDate])
let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicate1])
// Set the predicate on the fetch request
request.predicate = predicate
request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
var results : NSArray = context.executeFetchRequest(request, error: nil)!
注:
1) 我的开始日期和今天的格式为 2015-09-25(作为字符串)
2) 我在核心数据中日期属性的数据类型是 NSDate
3) 我能够成功地从核心数据中存储和获取日期
当我 运行 上面的代码时,我没有收到任何错误,但代码没有搜索两个日期之间的记录。我的意思是我得到的是空结果数组。
任何人都可以告诉我我在这里做错了什么。 另外请让我知道是否需要更多信息。提前致谢!
我认为您的谓词可能有误,请尝试修改为:
%@ <= date AND date <= %@
通过这种方式,您将看到 date
介于开始日期和结束日期之间。
经过多次修改和测试后,终于对我有用了,如下所示。如果您需要我如何将 nsdate 存储在 coredata 中,请检查上面的问题。
println(self.appdel.fromdate) // prints 2015-09-25
println(self.appdel.todate) // prints 2015-09-26
var fromdate = "\(self.appdel.fromdate) 00:00" // add hours and mins to fromdate
var todate = "\(self.appdel.todate) 23:59" // add hours and mins to todate
var context : NSManagedObjectContext = appdel.managedObjectContext!
var request = NSFetchRequest(entityName: "TblReportsP")
request.returnsObjectsAsFaults = false
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
dateFormatter.timeZone = NSTimeZone(name: "GMT") // this line resolved me the issue of getting one day less than the selected date
let startDate:NSDate = dateFormatter.dateFromString(fromdate)!
let endDate:NSDate = dateFormatter.dateFromString(todate)!
request.predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", startDate, endDate)
request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
var results : NSArray = context.executeFetchRequest(request, error: nil)!
println(results.count)