Сомнения в основных данных NSManagedObject Deep Copy - PullRequest
1 голос
/ 10 июня 2010

У меня есть ситуация, когда я должен скопировать один NSManagedObject из основного контекста в контекст редактирования.Большинству людей это кажется ненужным, как я видел в аналогичных ситуациях, описанных в Stackoverflow, но я выгляжу так, как будто мне это нужно.

В моем приложении много представлений в панели вкладок, и каждое представление обрабатывает различную информацию, которая связанак другим взглядам.Я думаю, что мне нужно несколько MOC, так как пользователь может переходить с вкладки на вкладку и оставлять несохраненные изменения в какой-либо вкладке, но, возможно, он сохраняет данные в другой вкладке / представлении, поэтому в этом случае изменения в остальных представлениях сохраняются без согласия пользователя.и в худшем случае приложение приводит к сбою.

Для добавления новой информации я выбрал добавление MOC, а затем слияние изменений в обоих MOC, но для редактирования это не так просто.Я видел похожую ситуацию здесь в Stackoverflow, но приложение аварийно завершает работу, поскольку моя модель данных, похоже, не использует NSMutableSet для отношений (я не думаю, что у меня есть отношение многие ко многим, только одно-м-многим) Я думаю, что это можно изменить, чтобы я мог получить отношения, как если бы они были атрибутами

for (NSString *attr in relationships) {
    [cloned setValue:[source valueForKey:attr] forKey:attr];
}

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

Может кто-нибудь, пожалуйста, просветите меня об этом?

1 Ответ

3 голосов
/ 13 июня 2010

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

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

Использование единого контекста решит все ваши проблемы с вашими попытками клонирования.Однако, если вам все еще интересно, как сделать глубокую копию NSManagedObject, вы можете получить некоторые рекомендации из примера кода в моей книге по адресу Прагматические программисты ;исходный код которого можно загрузить бесплатно.

Обновление

Все NSManagedObjectContext экземпляры являются "редактирующими".Вам нужен только один контекст на поток.Вы можете легко запросить контекст для не вставленных объектов, если вы хотите удалить их перед сохранением, и вы можете легко сохранить объекты по мере их изменения.За исключением некоторых крайних крайних случаев, вам не нужен второй контекст.

Обновление

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

Вы потратите больше времени на отладку, создавая глубокую копию объектов, чем это стоит в описываемом вами дизайне.Если вы собираетесь использовать более одного контекста, убедитесь, что они присоединены к одному и тому же NSPersistentStoreCoordinator, чтобы вам не нужно было копировать объекты вокруг, вы можете просто сохранить «вторичный» контекст и затем перехватить уведомление о сохранениив основном контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...