#swift #xcode #core-data #migration
#swift #xcode #core-data #миграция
Вопрос:
У меня есть базовая модель данных с объектом, содержащим множество атрибутов. Одним из этих атрибутов является:
dateTime: String
Теперь я хочу изменить тип на сегодняшний день. Я понимаю, что это невозможно сделать с помощью облегченной миграции. Тем не менее, я немного запутался в том, как перенести это, даже если это небольшое изменение.
Я создал вторую версию модели и изменил тип атрибута DateTime на Date.
Затем я создал модель сопоставления и изменил выражение значения на:
FUNCTION($entityPolicy, "dateTimeStringToDateDate:" , $source.dateTime)
Наконец, я создал новый класс следующим образом:
class DateTimeTransformationPolicy: NSEntityMigrationPolicy {
}
И я установил пользовательскую политику как
<*MyApp*>.DateTimeTransformationPolicy
Вот где я отклеился. Большинство примеров, которые я нашел, связаны с изменением отношений и т. Д. тогда как здесь я просто хочу изменить тип одного атрибута. Любое направление по этому вопросу было бы с благодарностью.
Изначально (хотя я знаю, что это неправильно) Я добавил следующий метод в класс DateTimeTransformationPolicy:
func dateTimeStringToDate(date: String) -> Date {
let formatter = DateFormatter()
let date = formatter.date(from: date)
return date ?? Date()
}
Опять же, я знаю, что здесь я использую неправильное дерево, но в любом случае метод даже не вызывается, когда я пытаюсь сохранить данные.
Комментарии:
1. Миграция не происходит при сохранении изменений. Это происходит при первой загрузке постоянного хранилища, обычно при запуске вашего приложения. Core Data замечает, что миграция необходима, и переносит все сразу. Этот метод следует сохранять только во время миграции, а не при сохранении изменений.
2. Спасибо Тому за ответ, это полезно знать. Однако я не использовал этот метод ни разу, поскольку сразу же установил на нем точку останова. Также не уверен в моем методе в любом случае. Будет ли передача в date: String работать? Я имею в виду, будет ли это автоматически вставляться в строки даты?
3. Функция будет вызвана со значениями, полученными до миграции. Поскольку старый тип данных есть
String
, это то, что будет передано. Как бы то ни было, эту функцию следует вызывать только в том случае, если (а) текущая модель данных является новой, которая использует дату вместо строки, и (б) текущее постоянное хранилище содержит данные из старой модели, которая все еще использует строку. И он будет вызываться только при первой загрузке данных во время миграции и никогда больше.