核心数据。按日期过滤

Posted

技术标签:

【中文标题】核心数据。按日期过滤【英文标题】: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 = %@", ?????)

【问题讨论】:

这能回答你的问题吗? CoreData conditionally fetching on NSDate using NSPredicate (swift) ***.com/a/57205589/1187415 谢谢两位,这些参考资料很有用。但我的问题有所不同,但有了这些信息,我仍然无法解决问题 如果它是Date 类型,那么dateCreated 不会以“2020-03-12 10:20:42 +0000”格式存储,即使这是您在打印它。正如@MartinR 和@mag_xbc 提供的链接所示,要过滤给定日期的项目,无论时间如何,您都需要选择 dateCreated 位于相关当天午夜之后和之后第二天午夜之前的项目。这就是这些答案所达到的效果。 【参考方案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 的格式必须相同。 我试图用另一种方式来解释它。我更新了我的问题 我已经更新了答案,我再次说谓词和核心数据中的日期格式必须相同

以上是关于核心数据。按日期过滤的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词根据日期属性过滤对象

如何在 SwiftUI 中以交互方式按年份过滤日期列表

核心数据:从过滤元素中获取最新记录

将核心数据过滤/排序到数组中

按核心数据中的日期组件获取条目

按分区上的 MIN(日期)过滤 |数据洞察