CoreData. Успешное сохранение неверных объектов - PullRequest
0 голосов
/ 16 августа 2011

У меня есть свойство (как managedObject) в синглтоне. Этот объект в свойстве может быть обновлен (удален, затем создан новый объект с пользовательским Id, равным Id старого объекта), затем я сохраняю контекст, обнуляю свойство, извлекаю новый объект и назначаю его свойству.

У меня не было ошибки, все нормально. После перезапуска приложения я получил исключение «CoreData не удалось выполнить ошибку». Я открыл базу данных с помощью sqliteBrowser и увидел там старый объект и новый объект. Новый объект правильный. Старые объекты (что должно быть удалено) имеют отношения с объектами, которые были удалены.

Кроме того, пользовательский интерфейс может иметь доступ к свойству managedObject, когда другой поток обновляет объект.

Как это может произойти? И как это предотвратить? Я прочитал устранение неполадок coreData с "CoreData не может выполнить ошибку". Я не нашел свою проблему с примера.

Я очень смущен этим. Я имею представление, но не уверен, что это хороший способ: Что делать, если сделать свойство не как managedObject, а как id (пользовательский идентификатор, как NSNumber), установщик owerload и получатель. Сеттер получает тот же объект, но имеет доступ к пользовательскому идентификатору и назначает идентификатор для свойства. Getter - получает объект по идентификатору, сохраненному в свойстве. Получатель и установщик заблокируют NSLock в начале и разблокируют его в конце. Поток, который обновляет объект, также блокирует блокировку до завершения обновления и сохранения. Большое спасибо!

P.S. Я очень извиняюсь, но я обычно не могу показать свой код по серьезной причине.

1 Ответ

1 голос
/ 17 августа 2011

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

Произошла ошибка «невозможно выполнить ошибку», поскольку oldObject имеет отношения, указывающие на некоторые другие объекты, которые вы удалили.Это вызвано неправильной конфигурацией модели данных, которая не нарушает отношения при удалении целевого объекта.Проверьте ваши правила удаления.Необходимо установить No Action.

Чтобы фактически удалить oldObject, вы должны либо указать контексту явно удалить его с помощью чего-то вроде:

[myManagedObjectContext deleteObject:oldObject];

... или установить отношение другого объекта, чтобы удалить егоиспользуя cascade правило удаления.

...