2016-09-29 91 views
11

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

enter image description here

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

我试过使用ValueTransformer,但它不适用于非@ objc类,如Date

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

回答

25

是的,但你可能不喜欢它。如果您使用核心数据“日期”类型声明物业,则让Xcode为您生成NSManagedObject子类,则该物业将为类型为NSDate的物业。正如你所想的那样,你必须自己处理DateNSDate

如果让Xcode中产生的子类,你(在Xcode 8组“代码生成”为“手动/无”),你可以声明核心数据“日期”的属性,就像这样

@NSManaged public var timestamp: Date? 

它会工作。您可以读取和写入Date值,Core Data将会做正确的事情。但是您完全负责NSManagedObject子类中的代码。你必须创建全班。如果你更新了核心数据模型,你也必须更新这个类。这看起来是否有价值取决于你,但它是现在似乎存在的唯一解决方案。

更新:在Xcode 9中,生成的代码使用Date,所以这应该不再需要了。

+1

这是唯一的办法,在Xcode 8.文件与苹果的增强请求,也许它会进入未来的更新。 –

+0

我刚刚注意到你写了一本关于CoreData的书。所以看起来没有意义等待另一个解决方案:)再次感谢。 – Avt

+4

那么选择将Codegen设置为“Manual/None”,然后自己创建整个类,只需在左侧选择模型并从菜单中选择“Editor - > Create NSManagedObjectSubclass”,如何选择?这为你创建了类,然后你所要做的就是将NSDate的更改为Date。每次更新模型时都必须执行此操作。 – oyalhi

3

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

Transformable date