2016-09-29 1 views
11

Ich habe viele Datumsfelder in meinem Datenbankmodell. CoreData ermöglicht die Verwendung von NSDate oder TimeInterval zum Speichern von Daten in Abhängigkeit von der Option "Skalarentyp verwenden".Verwenden Sie Swift's Date mit CoreData

enter image description here

aber diese beiden Optionen sind schlecht für mich, da ich Daten als Date Objekte verwenden möchten. Da NSDate nicht implizit in Date konvertierbar ist, muss ich Werte in Date konvertieren/umwandeln oder eine Menge von benutzerdefinierten Setter/Getter in meinen NSManagedObject-Klassen implementieren.

Ich habe versucht, ValueTransformer zu verwenden, aber es funktioniert nicht mit non @ objc Klassen wie Date.

So gibt es eine einfache Möglichkeit zu speichern und Date Werte zu/von CoreData zu erhalten?

Antwort

25

Ja, aber Sie mögen es vielleicht nicht. Wenn Sie die Eigenschaft mit einem Core Data "Date" Typ und deklarieren, lassen Sie Xcode die NSManagedObject Unterklasse für Sie generieren, wird die Eigenschaft eine @NSManaged Eigenschaft des Typs NSDate sein. Wie Sie herausgefunden haben, müssten Sie sich dann mit Date gegenüber NSDate befassen.

Wenn Sie nicht lassen Xcode die Unterklasse für Sie (in Xcode 8 Satz „Codegen“ auf „Manuell/None“) erzeugen, können Sie die Kerndaten „date“ Eigenschaft als so etwas wie

erklären
@NSManaged public var timestamp: Date? 

Es wird einfach funktionieren. Sie können Date Werte lesen und schreiben, und Core Data wird das Richtige tun. Aber Sie werden vollständig für den Code in der Unterklasse verantwortlich. Sie müssen die gesamte Klasse erstellen. Wenn Sie das Core Data-Modell aktualisieren, müssen Sie auch die Klasse aktualisieren. Ob dies sinnvoll erscheint, liegt an Ihnen, aber es ist die einzige Lösung, die momentan zu existieren scheint.

Aktualisierung: In Xcode 9 verwendet generierter Code Date, daher sollte dies nicht mehr notwendig sein.

+1

Es ist die einzige Art und Weise, in Xcode 8. Datei eine Erweiterung Anfrage mit Apple, und vielleicht wird es in einem zukünftigen Update zu bekommen. –

+0

Ich habe gerade bemerkt, dass Sie ein Buch über CoreData geschrieben haben. Es scheint also keinen Sinn zu geben, auf eine andere Lösung zu warten :) Danke noch einmal. – Avt

+4

Was ist mit der Option, "Codegen" auf "Manuell/Keine" zu setzen, anstatt die ganze Klasse selbst zu erstellen, wählen Sie einfach Ihr Modell auf der linken Seite und aus dem Menü "Editor -> Create NSManagedObjectSubclass"? Welche die Klasse für Sie erstellt, dann müssen Sie nur NSDate zu Datum ändern. Sie müssen dies jedes Mal tun, wenn Sie das Modell aktualisieren. – oyalhi

3

Es gibt hier eine Problemumgehung, die funktioniert, wenn Sie es als transformierbar festlegen und seine benutzerdefinierte Klasse auf Date setzen, funktioniert es einfach.

Transformable date