在CoreData中使用Swift的日期

时间:2016-09-29 19:03:48

标签: ios swift core-data nsdate nsvaluetransformer

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

enter image description here

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

我尝试使用ValueTransformer,但它不适用于{@ 1}}这样的非@objc类。

那么有一种简单的方法可以保存并从CoreData获取Date值吗?

2 个答案:

答案 0 :(得分:30)

是的,但你可能不喜欢它。如果使用核心数据“日期”类型声明属性让Xcode为您生成NSManagedObject子类,则该属性将是类型为{{1}的@NSManaged属性}}。如您所知,您必须自己处理NSDateDate的对比。

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

NSDate

它会起作用。您可以读取和写入@NSManaged public var timestamp: Date? 值,Core Data将做正确的事情。但是你对Date子类中的代码负有全部责任。你必须创建整个班级。如果更新Core Data模型,则还必须更新类。这看起来是否值得取决于你,但它是目前似乎存在的唯一解决方案。

更新:在Xcode 9中,生成的代码使用NSManagedObject,因此不再需要这样做了。

答案 1 :(得分:9)

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

Transformable date