【问题标题】:Use Swift's Date with CoreData将 Swift 的日期与 CoreData 一起使用
【发布时间】:2017-02-08 05:46:14
【问题描述】:

我的数据库模型中有很多日期字段。 CoreData 允许根据“使用标量类型”选项使用 NSDate 或 TimeInterval 来保存日期。

但是,这两个选项对我都不利,因为我想将日期用作 Date 对象。由于 NSDate 不能隐式转换为 Date 我必须将值转换/转换为 Date 或在我的 NSManagedObject 类中实现许多自定义设置器/获取器。

我曾尝试使用ValueTransformer,但它不适用于Date 等非@objc 类。

那么有没有一种简单的方法可以将Date 值保存到CoreData 或从CoreData 获取?

【问题讨论】:

    标签: ios swift core-data nsdate nsvaluetransformer


    【解决方案1】:

    是的,但你可能不喜欢它。如果您使用 Core Data "Date" 类型声明属性让 Xcode 为您生成 NSManagedObject 子类,则该属性将是 NSDate 类型的 @NSManaged 属性。正如您所知道的,您必须自己处理 DateNSDate

    如果您让 Xcode 为您生成子类(在 Xcode 8 中将“Codegen”设置为“Manual/None”),您可以将 Core Data 的“date”属性声明为喜欢

    @NSManaged public var timestamp: Date?
    

    它会起作用的。您可以读取和写入Date 值,Core Data 会做正确的事情。但是您将完全负责NSManagedObject 子类中的代码。您必须创建整个班级。如果你更新 Core Data 模型,你也必须更新类。这是否值得取决于您,但它是目前似乎存在的唯一解决方案。

    更新:在 Xcode 9 中,生成的代码使用 Date,因此不再需要。

    【讨论】:

    • 这是唯一的方法,在 Xcode 8 中。向 Apple 提交增强请求,也许它将进入未来的更新。
    • 我刚刚注意到你写了一本关于 CoreData 的书。因此,等待另一种解决方案似乎是没有意义的 :) 再次感谢。
    • 如何将“Codegen”设置为“Manual/None”而不是自己创建整个类,只需在左侧选择模型并从菜单中选择“Editor -> Create NSManagedObjectSubclass” “?它为您创建了课程,那么您所要做的就是将 NSDate 更改为 Date 的。每次更新模型时都必须这样做。
    • +! - 我花了很长时间寻找将日期转换为 NSDate 的方法。 Ping Apple 核心数据团队
    • 我刚刚尝试在 Xcode 9 中重新生成一个 Swift 类,但被覆盖的文件仍然使用 NSDate?我使用编辑器Create Managed Subclass 手动生成类。我失踪了吗?
    【解决方案2】:

    这里有一个可行的解决方法,如果您将其设置为可转换并将其自定义类设置为Date,它就可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多