swift coredata 查询不适用于今天的日期
Posted
技术标签:
【中文标题】swift coredata 查询不适用于今天的日期【英文标题】:swift coredata query not working for today's date 【发布时间】:2021-07-26 15:18:11 【问题描述】:我有一个名为 Places 的类,由 CoreData 管理。该对象有一个 Date 对象作为时间戳。
我有这个查询来仅探查今天的地点。问题是我今天只登录了 2 个地方,但是它给我带来了 21 条记录,这是我没想到的
func updatePlaceMarksForADateFromDatabase(date: Date)
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
let dateFrom = calendar.startOfDay(for: date)
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
// Set predicate as date being compliant with date
let fromPredicate = NSPredicate(format: "%@ >= %@", date as NSDate, dateFrom as NSDate)
let toPredicate = NSPredicate(format: "%@ < %@", date as NSDate, dateTo! as NSDate)
let datePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate])
// CoreData API's to list only today places
let fetchRequest: NSFetchRequest<Places> = Places.fetchRequest()
fetchRequest.predicate = datePredicate
if let context = (UIApplication.shared.delegate as? AppDelegate)?
.persistentContainer.viewContext
let sort = NSSortDescriptor(key: #keyPath(Places.timestamp), ascending: false)
fetchRequest.sortDescriptors = [sort]
if let placesCoreData = try?
context.fetch(fetchRequest)
// Store it to the cache
print(placesCoreData.count)
【问题讨论】:
我不懂你的谓词...应该是%K >= %@, #keyPath(Places.nameOfTheVariableHoldingTheDate), dateFrom
和%K < %@, #keyPath(Places.nameOfTheVariableHoldingTheDate), dateTo
@larme 它看起来像是来自this answer,这有点奇怪,因为这个无意义的谓词有 40 个赞成票,也许我错过了什么……
@JoakimDanielson 不错。如果我理解,该属性被命名为date
,并且对其进行了非常错误的编辑...最后一个:@ 987654322@ KeyPath 的第一个示例代码很好,但第二个绝对错误代码...
@Larme 我现在已经编辑了那个答案,希望它现在是正确的。
【参考方案1】:
你的谓词是错误的。
let fromPredicate = NSPredicate(format: "%@ >= %@", date as NSDate, dateFrom as NSDate)
let toPredicate = NSPredicate(format: "%@ < %@", date as NSDate, dateTo! as NSDate)
let datePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate])
您没有针对Places
的属性对其进行测试。目前,它等价于NSPredicate(value: true)
,因为date
大于或等于dateFrom
而小于dateTo
。它应该始终为真(根据值的创建方式)。这就是为什么你在获取时会得到所有的地方。
应该是:
let fromPredicate = NSPredicate(format: "%K >= %@", argumentArray: [#keyPath(Places.dateVariableName), dateFrom]
let toPredicate = NSPredicate(format: "%K < %@", argumentArray: [#keyPath(Places.dateVariableName), dateTo]
【讨论】:
感谢您指出这一点。是的,我需要包括这些地方。感谢大家的帮助以上是关于swift coredata 查询不适用于今天的日期的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 适用于我的模拟器,但不适用于使用 xCode 6 的 iOS 8 Swift 中的 iPhone
Swift 简便的 CoreData 查询类库 QueryKit
在 Swift 上使用 CoreData 使用 Fetch Request 进行查询