将日期保存到核心数据

Posted

技术标签:

【中文标题】将日期保存到核心数据【英文标题】:Save date to core data 【发布时间】:2017-02-21 00:32:58 【问题描述】:

好的,所以我正在尝试在 XCode 8 中学习 Swift 3。并且我已经学习了一些教程,并且我正在尝试构建自己的应用程序,它可以让我保存带有日期和类别的事件.

现在我很难中。最重要的是,我想在 UITextfield 中显示完整的日期样式,但将其保存为核心数据中的短日期样式。

有人对此有解决方案吗?请注意,我是一个 n00b,我不使用所有正确的术语。所以请告诉我我需要改变什么,因为我还在学习所有不同的东西是什么......

我认为我应该做的是创建一个函数,该函数将格式化字符串以保存核心数据(实体'MyEvents'的属性'dateOfEvent'设置为'date'),然后从datePickerChanged 函数使其始终保持更新。

到目前为止,我已经想出了这个,它是我发现的不同教程的混合体。

import UIKit

class addEventViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate 
    @IBOutlet weak var addEventNameInput: UITextField!
    @IBOutlet weak var addEventDateInput: UITextField!
    @IBOutlet weak var addEventCategoryInput: UITextField!

    var addEventCategories = ["Født", "Startede børnehave", "Startede uddannelse", "Startede job", "Flyttede hjemmefra", "Startede romantisk forhold", "Startede forhold"]
    var categoryPicker = UIPickerView()

    let datePicker = UIDatePicker()

    func textFieldDidBeginEditing(_ textField: UITextField) 
        addEventDateInput.inputView = datePicker
        datePicker.datePickerMode = .date
        datePicker.addTarget(self, action: #selector(datePickerChanged), for: .valueChanged)
    

    func datePickerChanged(sender: UIDatePicker) 
        let formatter = DateFormatter()
        formatter.dateStyle = .full
        formatter.timeStyle = .none

        addEventDateInput.text = formatter.string(from: sender.date)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        addEventNameInput.delegate = self
        addEventDateInput.delegate = self

        categoryPicker.delegate = self
        categoryPicker.dataSource = self
        addEventCategoryInput.inputView = categoryPicker
    

    func textFieldShouldReturn(_ textField: UITextField) -> Bool 
        textField.resignFirstResponder()
        return true
    

    // returns the number of 'columns' to display.
    func numberOfComponents(in pickerView: UIPickerView) -> Int 
        return 1
    

    // returns the # of rows in each component..
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return addEventCategories.count
    

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
        addEventCategoryInput.text = addEventCategories[row]
    

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
        return addEventCategories[row]
    

    @IBAction func addEventButtonPressed(_ sender: Any) 
        if addEventNameInput.text == "" 
         else 
            let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

            let newevent = MyEvents(context: context)
            newevent.nameOfevent = addEventNameInput.text!
            newevent.categoryOfevent = addEventCategoryInput.text!

            // Save data to coredata
            (UIApplication.shared.delegate as! AppDelegate).saveContext()

            // Pop back to events list
            navigationController!.popViewController(animated: true)
        
    

【问题讨论】:

所以你有一个名为dateOfEventNSManagedObject 作为MyEvents 的一部分,对吧?您应该可以通过说 new event.dateOfEvent = datePicker.date 将值设置为 datePicker 的当前日期 谢谢,皮尔斯!这确实节省了日期,但也节省了时间。我只想要日期:-) @Polle 没有“仅限日期”。将实际日期保存在数据库中,并使用日期格式化程序将这些值显示给用户。 啊啊,好的...所以我必须保存整个日期,包括时间,然后在我使用日期时简单地排除时间?谢谢,伙计! 【参考方案1】:

您应该将日期保存为数据库中的日期。日期对象代表特定的时间点,因此没有“没有时间的日期”。

使用日期格式化程序仅向用户显示您感兴趣的日期部分。不要将显示格式与数据存储混淆。

因此,您需要的只是托管对象上的 Date 类型属性,您将其设置为选择器的 date 属性。

【讨论】:

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

将 TextField 条目从模态视图控制器保存到核心数据单独的实体

将获取的数据保存在磁盘上

Swift - 使用 for 循环将数据添加到核心数据

如何按日期过滤核心数据项?

最佳核心数据保存策略(何时将数据保存到磁盘)

如何将日期+时间保存和检索到 sqlite3 数据库中?