Используйте дату Swift с CoreData
У меня много полей даты в моей модели базы данных. CoreData позволяет использовать NSDate или TimeInterval для сохранения дат в зависимости от опции "Использовать скалярный тип".
Однако оба эти варианта плохи для меня, так как я хочу использовать даты в качестве объектов Date. Поскольку NSDate не является неявно преобразованным в Date
Я должен привести / преобразовать значения в Date
или реализовать множество пользовательских сеттеров / геттеров в моих классах NSManagedObject.
Я пытался использовать ValueTransformer
но он не работает с не-objc классами, такими как Date
,
Так есть ли простой способ сохранить и получить Date
значения в / из CoreData?
2 ответа
Да, но вам это может не понравиться. Если вы объявляете свойство с использованием типа "Базовые данные" и позволяете Xcode сгенерировать NSManagedObject
подкласс для вас, собственность будет @NSManaged
свойство типа NSDate
, Как вы уже поняли, вам придется иметь дело с Date
против NSDate
сам.
Если вы не позволите Xcode сгенерировать для вас подкласс (в Xcode 8 установите "Codegen" на "Manual/None"), вы можете объявить свойство date "Core Data" как-то так:
@NSManaged public var timestamp: Date?
Это просто сработает. Вы можете читать и писать Date
значения и Core Data будут делать правильные вещи. Но вы становитесь полностью ответственным за код в NSManagedObject
подкласс. Вам придется создать целый класс. Если вы обновите модель Core Data, вам также придется обновить класс. Вопрос о том, кажется ли это стоящим, зависит от вас, но это единственное решение, которое существует сейчас.
Обновление: в Xcode 9, сгенерированный код использует Date
так что в этом больше нет необходимости.
Здесь есть обходной путь, который работает, если вы установите его как трансформируемый и установите его пользовательский класс в Date
это просто работает.