Невозможно перенести основную модель данных с изменением типа атрибута

#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 , это то, что будет передано. Как бы то ни было, эту функцию следует вызывать только в том случае, если (а) текущая модель данных является новой, которая использует дату вместо строки, и (б) текущее постоянное хранилище содержит данные из старой модели, которая все еще использует строку. И он будет вызываться только при первой загрузке данных во время миграции и никогда больше.