Сбой Swift при создании нового атрибута CoreData для существующего объекта

Я пытаюсь программно создать новый атрибут для уже существующей сущности в swift.
Это мой код:

    let model = NSManagedObjectModel()
    var properties = Array<NSAttributeDescription>()
    let remoteURLAttribute = NSAttributeDescription()
    remoteURLAttribute.name = "\(foundArray[indexPath.row]) id"
    remoteURLAttribute.attributeType = .stringAttributeType
    remoteURLAttribute.isOptional = false
    remoteURLAttribute.isIndexed = true
    properties.append(remoteURLAttribute)
    entity?.properties = properties
    model.entities = [entity!]

Приложение всегда вылетает с этой ошибкой:

Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Невозможно изменить неизменяемую модель».

Как я могу это исправить?


person Roberto Tonini    schedule 02.08.2016    source источник


Ответы (3)


arrow_upward
1
arrow_downward

Вы можете изменить модель данных только перед ее использованием для чтения или хранения данных. Он изменяется при первой загрузке, но становится неизменяемым, как только вы используете его для чего-либо, кроме редактирования модели.

Изменение модели таким образом обычно является плохой идеей. Но если это необходимо по какой-либо причине, вы должны сделать это перед загрузкой или сохранением каких-либо данных с помощью модели.

person Tom Harrington    schedule 02.08.2016
comment
Вы правы, но я хочу добавить новый атрибут к уже существующей сущности. Как я могу это сделать? - person Roberto Tonini; 02.08.2016
comment
Обычный способ — создать новый версию файла модели и выполнить миграцию модели. Можно изменить модель в коде, но это очень необычно, и даже в этом случае вам все равно придется выполнять миграцию модели. - person Tom Harrington; 02.08.2016
comment
Итак, что лучше: создать новую модель или найти другой способ без создания нового атрибута? - person Roberto Tonini; 02.08.2016
comment
Это не новая модель, это новая версия той же модели. Xcode и Core Data имеют встроенную поддержку нескольких версий одного и того же файла модели. Это лучший и, безусловно, самый распространенный способ. В вашем случае создайте новую версию модели, которая добавляет этот новый атрибут. - person Tom Harrington; 02.08.2016
comment
Могу ли я следовать этому (developer.apple.com/library /ios/recipes/) руководство? - person Roberto Tonini; 02.08.2016
comment
Эта ссылка дает мне ошибку «не найдено», но URL-адрес предполагает, что было бы правильно, если бы я мог ее найти, поскольку в нем упоминается создание новой версии модели. - person Tom Harrington; 02.08.2016
comment
Я создал новую версию основной модели, но не понял, что теперь делать - person Roberto Tonini; 02.08.2016
comment
Выше я ссылался на документацию Apple по шагам; вам нужна облегченная миграция Комментарии StackOverflow не являются хорошим местом для объяснения процесса. Прочтите и задайте другой вопрос, если у вас возникнут проблемы. - person Tom Harrington; 02.08.2016

arrow_upward
1
arrow_downward

Модель недоступна для редактирования во время выполнения. См. документацию, параграф Editing Models Programmatically. Вы можете только скопировать его и внести свои изменения.

person eMKa    schedule 02.08.2016

arrow_upward
-1
arrow_downward

На самом деле я этого не пробовал, но как насчет изменения модели с константы на переменную (т.е. var вместо let).

person Andy Etheridge    schedule 02.08.2016