2016-09-29 2 views
11

У меня есть много полей даты в моей базе данных. CoreData позволяет использовать NSDate или TimeInterval для сохранения дат в зависимости от опции Use Scalar Type.Использовать дату Swift с CoreData

enter image description here

Однако оба эти варианта плохо для меня, так как я хочу, чтобы использовать в качестве даты Date объектов. Поскольку NSDate неявно конвертируется в Date, я должен преобразовать значения в Date или реализовать множество пользовательских сеттеров/геттеров в классах NSManagedObject.

Я попытался использовать ValueTransformer, но он не работает с классами не @ objc, такими как Date.

Итак, есть простой способ сохранить и получить значения Date в/из CoreData?

ответ

25

Да, но вам это может не понравиться. Если вы объявите свойство с использованием базовых данных «Дата» типа и, позвольте Xcode сгенерировать подкласс NSManagedObject для вас, то это будет свойство @NSManaged типа NSDate. Как вы поняли, вам придется иметь дело с Date против NSDate.

Если вы не позволяют Xcode генерировать подкласс для вас (в Xcode 8 набор «Codegen» в «Manual/None»), вы можете объявить Ядро данных «дата» свойство, как что-то вроде

@NSManaged public var timestamp: Date? 

Он будет работать. Вы можете читать и писать значения Date, а Core Data будет делать все правильно. Но вы полностью несете ответственность за код в подклассе NSManagedObject. Вам нужно будет создать весь класс. Если вы обновите модель Core Data, вам также придется обновить класс. Стоит ли это стоять именно вам, но это единственное решение, которое, кажется, существует прямо сейчас.

Обновление: В Xcode 9 сгенерированный код использует Date, так что это больше не нужно.

+1

Это единственный способ, в Xcode 8. Файл запроса усиление с Apple, и, возможно, он будет получать в будущем обновлении. –

+0

Я только что заметил, что вы написали книгу о CoreData. Так что, похоже, нет смысла ждать другого решения :) Спасибо еще раз. – Avt

+4

Как насчет возможности установки «Codegen» на «Manual/None», а не для создания всего класса самостоятельно, просто выбрав свою модель слева и в меню, выбрав «Редактор -> Создать NSManagedObjectSubclass»? Что создает класс для вас, тогда все, что вам нужно сделать, это изменить NSDate на Date's. Вам придется делать это каждый раз, когда вы обновляете модель. – oyalhi

3

Существует обходное решение, которое работает, если вы установите его как трансформируемое и установите его собственный класс на Date, он просто работает.

Transformable date

Смежные вопросы