【问题标题】:How to filter Core Data fetch request result如何过滤核心数据获取请求结果
【发布时间】:2018-02-01 19:51:20
【问题描述】:

如何从 Core Data 获取请求输出中提取最后一个 apiCallsToday 值?

var result: [NSManagedObject]?

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

let managedContext = appDelegate.persistentContainer.viewContext

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "ApiCalls")
fetchRequest.returnsObjectsAsFaults = false

    do {
        result = try managedContext.fetch(fetchRequest)
        print(result!)
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }

控制台输出:

【问题讨论】:

  • 您实际上并未存储日期对象。您正在存储日期字符串,这应该更容易。以与您的 dateString 相同的格式格式化今天的日期,然后将您的获取请求设置为具有谓词 NSPredicate(format:"dateString = %@", formattedTodaysDateString)。
  • 这是怎么回事?

标签: swift core-data


【解决方案1】:

我不确定您的核心数据对象模型是什么样的,但正如 Sandeep 指出的那样,您将日期存储为字符串。纠正此问题的一种可能性是更新您的模型,使您的 ApiCalls 具有存储 Datedate 属性,而不是存储 StringdateString 属性。

要从日期字符串中提取日期,您可以使用DateFormatter

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd.MM.yyyy"
let date = dateFormatter.date(from: dateString)

然后,当您创建 ApiCalls 对象时,您将存储实际的 Date 而不是 String

如果您想要最新的,您可能不想过滤它,而是按日期键对结果进行排序。您可以将NSSortDescriptor 添加到您的fetchRequest

guard let appDelegate =
  UIApplication.shared.delegate as? AppDelegate else {
    return
}

var results: [ApiCalls] = []

let managedContext =
  appDelegate.persistentContainer.viewContext

let fetchRequest =
  NSFetchRequest<NSManagedObject>(entityName: "ApiCalls")
let sortDescriptor = NSSortDescriptor(key: #keyPath(ApiCalls.date), ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.fetchLimit = 1

do {
  results = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
  print("Could not fetch. \(error), \(error.userInfo)")
}

let mostRecentDate = results.first

【讨论】:

  • 为避免获取所有对象,当只需要最后一个对象时,您可以指定反向排序描述符(升序:false)并应用 fetchLimit=1。
  • @pbasdf 很棒的电话!更新
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2019-11-06
相关资源
最近更新 更多