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 &gt;= %@, #keyPath(Places.nameOfTheVariableHoldingTheDate), dateFrom%K &lt; %@, #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 进行查询

Mixpanel 不适用于 swift

Swift - snapshotView 功能不适用于大型 UIView

NSKeyedUnarchiver 不适用于 Swift 3