【问题标题】:Check Core Data for an entry with Today's Date & perform function检查核心数据以获取具有今日日期和执行功能的条目
【发布时间】:2018-12-29 12:55:34
【问题描述】:

我对 Swift 还很陌生,希望有人知道这个问题的答案 - 我尝试的任何方法似乎都不起作用!

我有一个 Swift 应用程序,它有一个名为“Drink”的核心数据实体,它有 2 个键:一个日期和一个名为“drinkWater”的实体,当按下按钮时存储值“1”。

我正在尝试编写一个单独的函数,我可以在其中检查今天日期是否存在条目,如果存在,则执行操作(在这种情况下更改图像视图)。

我意识到以下不是答案,但我已经知道了!基本上我可以根据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)")

}

这会返回:

2018-12-29 01:27:27 +0000

日期为 2018-12-29 12:21:21 +0000

任何关于如何将这一切变成正确功能的想法将不胜感激!

【问题讨论】:

    标签: swift core-data nspredicate nsfetchedresultscontroller


    【解决方案1】:

    您需要在复合谓词中使用从一天开始到一天结束(午夜到午夜)的日期范围。这是基于类似SO question的解决方案

    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])
    

    【讨论】:

      【解决方案2】:

      感谢您的所有帮助。我现在一切正常。我的最终代码是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2017-03-11
        相关资源
        最近更新 更多