检查核心数据以获取包含今天日期的条目并执行功能
Check Core Data for an entry with Today's Date & perform function
我是 Swift 的新手,希望有人知道这个问题的答案 - 我尝试的任何方法似乎都不起作用!
我有一个 Swift 应用程序,它有一个名为 "Drink" 的核心数据实体,带有 2 个键:一个日期和一个名为 "drinkWater" 的实体,当按下了一个按钮。
我正在尝试编写一个单独的函数,我可以在其中检查是否存在今天日期的条目,如果存在,则执行操作(在本例中更改图像视图)。
我意识到以下不是答案,但这是我得到的答案!基本上我可以根据 drinkWater 的值获取所有条目(这需要在我猜的日期之前?)并且我可以将今天的日期全部打印到控制台。现在我卡住了...
private func updateMyImageView() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSPredicate(format: "drinkWater = %@", "1")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "timestamp") as! Date)
}
} catch {
print("Failed")
}
let dateNow = Date()
print("Date is \(dateNow)")
}
这个returns:
2018-12-2901:27:27+0000
日期是 2018-12-29 12:21:21 +0000
任何关于如何将这一切变成正确功能的想法将不胜感激!!
您需要在复合谓词中使用从一天开始到一天结束(午夜到午夜)的日期范围。这是一个基于类似 SO
的解决方案
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let dateFrom = calendar.startOfDay(for: Date())
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])
感谢您的帮助。我现在一切正常。我的最终代码是:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let dateFrom = calendar.startOfDay(for: Date())
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "timestamp") as! Date)
drinkMoreButton.setBackgroundImage(UIImage(named: "watericonselected.png"), for: UIControlState.normal)
}
} catch {
print("Failed")
}
我是 Swift 的新手,希望有人知道这个问题的答案 - 我尝试的任何方法似乎都不起作用!
我有一个 Swift 应用程序,它有一个名为 "Drink" 的核心数据实体,带有 2 个键:一个日期和一个名为 "drinkWater" 的实体,当按下了一个按钮。
我正在尝试编写一个单独的函数,我可以在其中检查是否存在今天日期的条目,如果存在,则执行操作(在本例中更改图像视图)。
我意识到以下不是答案,但这是我得到的答案!基本上我可以根据 drinkWater 的值获取所有条目(这需要在我猜的日期之前?)并且我可以将今天的日期全部打印到控制台。现在我卡住了...
private func updateMyImageView() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSPredicate(format: "drinkWater = %@", "1")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "timestamp") as! Date)
}
} catch {
print("Failed")
}
let dateNow = Date()
print("Date is \(dateNow)")
}
这个returns:
2018-12-2901:27:27+0000
日期是 2018-12-29 12:21:21 +0000
任何关于如何将这一切变成正确功能的想法将不胜感激!!
您需要在复合谓词中使用从一天开始到一天结束(午夜到午夜)的日期范围。这是一个基于类似 SO
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let dateFrom = calendar.startOfDay(for: Date())
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])
感谢您的帮助。我现在一切正常。我的最终代码是:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let dateFrom = calendar.startOfDay(for: Date())
let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)
let fromPredicate = NSPredicate(format: "timestamp >= %@", dateFrom as NSDate)
let toPredicate = NSPredicate(format: "timestamp < %@", dateTo! as NSDate)
let waterPredicate = NSPredicate(format: "drinkWater = %@", "1")
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Drink")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [waterPredicate, fromPredicate, toPredicate])
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "timestamp") as! Date)
drinkMoreButton.setBackgroundImage(UIImage(named: "watericonselected.png"), for: UIControlState.normal)
}
} catch {
print("Failed")
}