核心数据。按日期过滤
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 的格式必须相同。
我试图用另一种方式来解释它。我更新了我的问题
我已经更新了答案,我再次说谓词和核心数据中的日期格式必须相同以上是关于核心数据。按日期过滤的主要内容,如果未能解决你的问题,请参考以下文章