Сбой 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)


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

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

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

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

person eMKa    schedule 02.08.2016

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

person Andy Etheridge    schedule 02.08.2016