Как мне создать много временных объектов, а затем сохранить только один, используя Core Data? - PullRequest
10 голосов
/ 25 октября 2009

Я работаю над приложением, которое выполнит поиск по онлайн-сервису и сгенерирует много объектов Result. Объект Result - это NSManagedObject, инициализированный в соответствии с требованиями, связав его с NSManagedObjectContext.

Пользователи должны иметь возможность выбрать «Результат» и сохранить его как «Избранное». В приложении это так же просто, как связать объект Result с новым объектом Favorite и сохранить контекст.

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

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

У кого-нибудь есть предложения? Я полностью извлечен из этого.

Ответы [ 3 ]

5 голосов
/ 25 октября 2009

Вы должны использовать разные контексты для каждого объекта. Использование отдельного контекста управляемого объекта позволяет работать следующим образом. Когда пользователь выбирает свой любимый объект, вы просто отбрасываете контексты, связанные с остальными объектами результата. Нет необходимости объединять изменения и т. Д. Есть в основном компромисс. В итоге вы управляете (создаете / отбрасываете) несколько контекстов, но затем вы легко достигаете своей цели. В противном случае вы все равно можете сделать это, используя только один контекст. Однако вы должны явно вставить или удалить каждый объект, как показано в следующих фрагментах кода.

Попробуй это. Только для любимого объекта, который вы хотите сохранить, выполните следующие действия:

[managedObjectContext insertObject:theFavorite];

Для каждого из остальных объектов результата сделайте это вместо:

[managedObjectContext deleteObject:aResult];

затем сохраните как обычно

NSError *error = nil
if (![managedObjectContext save:&error]) {
   // Handle error

}

Это сохранит ТОЛЬКО выбранный вами, любимый объект.

4 голосов
/ 23 мая 2011

Я предпочитаю использовать контекст NIL и иметь базовый класс модели домена для обработки рекурсивного добавления объектов в допустимый контекст, когда я хочу сохранить их. Он работает очень хорошо (и чисто!) ... код доступен здесь ... Временные базовые данные

3 голосов
/ 25 октября 2009

Создание объектов Result, которые не являются подклассами NSManagedObject. Когда пользователь выберет один, создайте один управляемый экземпляр и сохраните его.

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