【问题标题】:Core Data. Filter by date核心数据。按日期过滤
【发布时间】:2020-03-12 10:38:13
【问题描述】:

我在 Core Data 中有一个 .xcdatamodel,其中包含实体内容和属性 dateCreated 类型日期和 text1 类型字符串。

//CREATE
   func createData() {
       guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
       let managedContext = appDelegate.persistentContainer.viewContext
       let contentEntity = NSEntityDescription.entity(forEntityName: "Content", in: managedContext)!

       let content = NSManagedObject(entity: contentEntity, insertInto: managedContext)
       content.setValue(Date(), forKey: "dateCreated")
       content.setValue("someText", forKey: "text1")

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

//READ
    func readData() {
           guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
           let managedContext = appDelegate.persistentContainer.viewContext
           let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Content")
           fetchRequest.predicate = NSPredicate(format: "text1 = %@", "some text")

           do {
               let result = try managedContext.fetch(fetchRequest)

               for data in result as! [NSManagedObject] {
                   print(data.value(forKey: "dateCreated") as! Date)
                   print(data.value(forKey: "text1") as! String)
               }
           } catch {
               print("Failed")
           }
       }

如果我打印 dateCreated,它会给出:2020-03-12 10:20:42 +0000 我的问题是:如何按日期阅读和过滤?只有日期,没有时间。例如 2020-03-12 或任何其他没有时间的日期:

fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", ?????)

【问题讨论】:

  • 谢谢两位,这些参考资料很有用。但我的问题有所不同,但有了这些信息,我仍然无法解决问题
  • 如果它是Date 类型,那么dateCreated 不会以“2020-03-12 10:20:42 +0000”格式存储,即使这是您在打印它。正如@MartinR 和@mag_xbc 提供的链接所示,要过滤给定日期的项目,无论时间如何,您都需要选择 dateCreated 位于相关当天午夜之后和之后第二天午夜之前的项目。这就是这些答案所达到的效果。

标签: swift core-data


【解决方案1】:

在 CreateData() 中,您使用 Date() 存储日期。这样它将以 yyyy-MM-dd HH:mm:ss ZZZZ 格式存储在您的数据库中。这就是它打印此 2020-03-12 10:20:42 +0000

的原因

改变

fetchRequest.predicate = NSPredicate(format: "text1 = %@", "some text")

到

fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", Date())

如果您使用此谓词而不是 text1,核心数据将为您提供 Date 的结果,如果有时间很难过滤。因此,您必须通过将其格式更改为 yyyy-MM-dd

来插入日期

您可以使用 DateFormatter() 更改当前日期格式。

//Needed date format
let dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd"
let formattedDate = dateFormat.string(from: Date())

所以尝试通过更改格式来插入 Date()

//in CreateData()
content.setValue(formattedDate, forKey: "dateCreated")

//in ReadData()
fetchRequest.predicate = NSPredicate(format: "dateCreated = %@", formattedDate)

【讨论】:

  • 我了解您正在将日期时间转换为日期。但是如何向数据库发起 readData 请求和过滤呢?
  • 抱歉,没听懂。是否尝试通过过滤日期来获取数据?
  • let datePredicate = NSPredicate(format: "dateCreated = %@", currentDate) 在执行此操作之前,您必须检查用于存储核心数据的格式。因为 currentDate 和 dateCreated 的格式必须相同。
  • 我试图用另一种方式来解释它。我更新了我的问题
  • 我已经更新了答案,我再次说谓词和核心数据中的日期格式必须相同
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多