检查核心数据以获取包含今天日期的条目并执行功能

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")
        }