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

StackOverflow https://stackoverflow.com/questions/1619911

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

[managedObjectContext insertObject:theFavorite];

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

[managedObjectContext deleteObject:aResult];

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

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

}

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top