【问题标题】:Swift Get an Array of dates from ManagedObjectContext FetchRequestSwift 从 ManagedObjectContext FetchRequest 获取日期数组
【发布时间】:2016-05-10 16:31:13
【问题描述】:

我正在尝试为 Core Data 中的 Date 属性创建 NSDates 数组(保存日期数组)。所以我可以在日历上显示保存项目的日期。我已尝试使用以下代码,但出现错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法解析格式字符串“savedTime”

func datesWithSavedData() -> [NSDate] {
  let fetchRequest = NSFetchRequest(entityName: "UserData")
  fetchRequest.predicate = NSPredicate(format: "savedTime'")
  fetchRequest.sortDescriptors = [NSSortDescriptor(key: "savedTime", ascending: false)]
  do {
    let results =
      try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSDate]
    selectedDates = results!
    print(selectedDates)
  } catch let error as NSError {
    print("Could not fetch \(error), \(error.userInfo)")
  }

  return selectedDates as! [NSDate]
}

【问题讨论】:

  • NSPredicate(format: "savedTime'") 没有意义。谓词用于过滤结果集,那么你想实现什么?如果您想要所有条目,请省略谓词。
  • 我已经尝试过了,在 selectedDates = results 行上出现“致命错误:在展开可选值时意外发现 nil”的错误!
  • 日期,我将它们保存为 nsdate。
  • executeFetchRequest 默认总是返回[NSManagedObject]。但是您可以通过将请求的resultType 设置为.DictionaryResultTypepropertiesToFetch 来获取所需属性的数组,从而获得一组简单的字典。然后您可以使用map 函数或KVC 来获取您的NSDate 数组。
  • 这可能会有所帮助:stackoverflow.com/questions/28054621/…(现已更新为 Swift 2)

标签: ios arrays swift core-data nspredicate


【解决方案1】:

一个解决方案是告诉 Core Data 返回一个字典数组而不是 [NSManagedObject] 例如

func datesWithSavedData() -> [NSDate] {
    let fetchRequest = NSFetchRequest(entityName: "UserData")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "savedTime", ascending: false)]
    fetchRequest.resultType = .DictionaryResultType
    fetchRequest.propertiesToFetch = ["savedTime"]
    do {
       let results = try managedObjectContext.executeFetchRequest(fetchRequest) as! [[String:NSDate]]
       return results.map { $0["savedTime"] as! NSDate }

    } catch let error as NSError {
       print(error)
       return [NSDate]()
    }
}

Swift 3+

func datesWithSavedData() -> [Date] {
    let fetchRequest : NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "UserData")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "savedTime", ascending: false)]
    fetchRequest.resultType = .dictionaryResultType
    fetchRequest.propertiesToFetch = ["savedTime"]
    do {
       let results = try managedObjectContext.fetch(fetchRequest) as! [[String:Date]]
       return results.map { $0["savedTime"] as! Date }

    } catch {
       print(error)
       return [Date]()
    }
}

【讨论】:

  • 这很有效,并且提供了一个完美的 nsdates 字典!另一种解决方案从核心数据中提供整个实体的输出,而不仅仅是日期。
猜你喜欢
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多