временный объект tableview coredata

Я использую tableview с данными из coredata, используя nsfetchedresultscontroller. Когда представление загружается, я создаю новый объект, используя

SomeManagedObject *someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeManagedObject" inManagedObjectContext:self.managedObjectContext];

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

Есть ли у них способ сохранить только один объект, а не все внутри управляемогоObjectContext?

Есть ли у них другой способ создать временный объект для моего представления таблицы.

Любая помощь будет очень приветствоваться. Спасибо Тон


person Ton    schedule 27.06.2010    source источник
comment
Вы можете передать нулевой контекст в initWithEntity: insertIntoManagedObjectContext. См. Этот вопрос: stackoverflow.com / questions / 3256195 /   -  person Symmetric    schedule 26.09.2012


Ответы (3)


Создайте новый NSManagedObject с его alloc init и передайте nil вместо NSManagedObjectContext. Затем, если вы позже решите, что хотите, чтобы этот объект был постоянным, установите его контекст. Однако это не позволит вам увидеть его в NSFetchedResultsController, потому что он не будет связан с контекстом.

Можно дать лучший ответ, если вы объясните, какова ваша конечная цель.

person Marcus S. Zarra    schedule 07.08.2010
comment
Это не удастся для свойств @dynamic. В документе для initWithEntity: insertIntoManagedObjectContext говорится: «Важно». Этот метод является назначенным инициализатором для NSManagedObject. Вы не должны инициализировать управляемый объект, просто отправив его init. - person Symmetric; 26.09.2012
comment
Ваш комментарий не имеет смысла. В моем ответе конкретные состояния передать nil для NSManagedObjectContext. Не было никаких намеков на то, что должен быть вызван голый -init. - person Marcus S. Zarra; 26.09.2012
comment
Окей, прости. Я прочитал alloc init выше как простой init, а не initWithEntity. В любом случае, ваш ответ на этот другой вопрос делает его более ясным, спасибо: stackoverflow.com/questions/3256195/ - person Symmetric; 26.09.2012

Нет, в ManagedObjectContext сохраняется все или ничего. Я не знаю, что произойдет, если вы установите для постоянного хранилища управляемого объекта значение nil.

- (void)assignObject:(id)object toPersistentStore:(NSPersistentStore *)store

Если вы затем сохраните managedObjectContext, этот объект не будет сохранен. Это всего лишь предположение, но скажите мне, работает ли это ;-)

person GorillaPatch    schedule 27.06.2010
comment
Неа. это не работает. Я предполагаю, что он назначит объект хранилищу по умолчанию при использовании nil. - person Ton; 28.06.2010

Для временных управляемых объектов создайте их со вторым контекстом управляемого объекта (MOC). Когда вы закончите, просто отпустите MOC, не выполняя сохранения.

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

person Scott McCammon    schedule 06.08.2010
comment
Не создавайте отдельный контекст. Это чрезвычайно расточительно и дорого. Если объект должен быть временным, создайте его с помощью -init и вообще не передавайте в контекст. - person Marcus S. Zarra; 08.08.2010
comment
Согласитесь с Маркусом, вот как я это делаю, и я использую базовый класс для обработки рекурсивной вставки в допустимый контекст ... locassa.com/index.php/2011/05/ - person Simon Lee; 23.05.2011
comment
@ MarcusS.Zarra, вы все же не рекомендуете создавать отдельный контекст для временных (потенциально выброшенных) объектов? Действует ли он еще в 2014 году? Заранее спасибо. - person A.S.; 24.03.2014
comment
Нет, создание NSManagedObjectContext стало НАМНОГО дешевле, и их легко создать. Я все еще не фанат создания мультипликаторов, чтобы просто выбросить их, но сейчас это намного дешевле. - person Marcus S. Zarra; 25.03.2014