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

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

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

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

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

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


person user174448    schedule 25.10.2009    source источник


Ответы (3)


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

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

[managedObjectContext insertObject:theFavorite];

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

[managedObjectContext deleteObject:aResult];

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

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

}

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

person Massimo Cafaro    schedule 25.10.2009
comment
Мы пошли с первой частью вашего ответа. Мы используем граф контекста для каждого объекта и сохраняем его по мере необходимости. - person user174448; 26.10.2009

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

person Simon Lee    schedule 22.05.2011
comment
Это хорошее решение для временного объекта. Однако что происходит, когда вы добавляете объект в набор отношений, который имеет контекст? Какой здесь лучший подход? - person Luke Mcneice; 22.05.2012
comment
Также см. Этот вопрос: http://stackoverflow.com/questions/3256195/how-to-deal-with-Contemporary-nsmanagedobject-instances - person Symmetric; 26.09.2012

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

person Steve Weller    schedule 25.10.2009
comment
Я упростил задачу для краткости. Объект Result - это объект со множеством свойств и несколькими отношениями. Мысль о дублировании классов вызывает у меня рвоту :) - person user174448; 25.10.2009