2016-07-10 4 views
2

В принципе, я пытаюсь получить доступ к некоторым свойствам a после удаления его из NSManagedObjectContext и сохранения контекста. Проблема заключается в том, что после сохранения контекста Core Data помечает данные объекта как ошибки и, по-видимому, не может его восстановить.Ошибка основных данных после удаления управляемого объекта

Я создал образец проекта, чтобы воспроизвести проблему, вы можете скачать ее here. Чтобы проиллюстрировать это, следующий фрагмент кода:

City *city = [self.cities objectAtIndex:indexPath.row]; 
[self.managedObjectContext deleteObject:city]; 
if (![self.managedObjectContext save:&error]) { 
    [self.managedObjectContext rollback]; 
    NSLog(@"Error: %@", error); 
}else{ 
    NSLog(@"%@", city); 
    // All properties of "city" are zeroed. 
    // Saved. Update data sources and animate changes... 
} 

производит:

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: { 
    country = "0xd000000000080002 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/Country/p2>"; 
    name = Rosario; 
}) 

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: <fault>) 

Поэтому я хотел бы получить доступ к управляемому объекту, после его удаления, чтобы обновить NSMutableArray, который действует в качестве источника данных для представление таблицы и обновление другого источника данных в предыдущем контроллере в стеке контроллера навигации (это не реализовано в примере проекта).

Завершая, мои вопросы не являются:

После удаления NSManagedObject из его NSManagedObjectContext и сохранения контекста, оно больше не гарантируются, что данные в управляемом объекте будут доступны? Даже если ссылка на этот управляемый объект сохранена?

Основываясь на том, что я исследовал, Core Data избавляется от данных сущности для сохранения памяти после сохранения контекста. Правильно ли это предположение? Существуют ли другие факторы, которые могут привести к сбою этих данных?

Спасибо.

+1

Почему вы ожидаете получить доступ к удаленному объекту после сохранения контекста? Используйте «NSFetchedResultsController» для источников данных. – Avi

+0

Вы не должны использовать ссылки на удаленные объекты. – Andy

+0

@Avi, потому что я сохранил ссылки на управляемый объект. – Mateus

ответ

1

NSManagedObject всегда динамически визуализируется. Следовательно, если он удален, Core Data выдает данные. Он больше не существует. Ваш реальный вопрос - как удалить объект из разных массивов? Во-первых, вы должны удалить его, прежде чем удалять объект, используя любые методы поиска, которые вы хотите. Это самый простой и надежный путь. Во-вторых, сам указатель объекта по-прежнему действителен и может использоваться с вызовом -removeObject:. Позвольте мне подчеркнуть, однако, это хрупкое решение. Я настоятельно рекомендую вам удалить объект перед его удалением.

В ответ на ваш второй вопрос,

Существует ли другие факторы, которые могут быть причиной этого Сбойных данные?

Нет. Удаление объекта вызывает сбои. Если данные до сих пор были доступны, это связано с тем, что оно является характеристикой реализации. Запись на реализацию вместо спецификации, особенно с технологиями баз данных, чревата всевозможными проблемами жизненного цикла. Цитируя мудрого доктора: «Не делай этого».

+0

Спасибо! Не могли бы вы объяснить, почему не рекомендуется удалять объект после его удаления и убедиться, что контекст был сохранен? – Mateus

+0

Да, контекст сохранения почти никогда не терпит неудачу. В принципе, он не работает с очень редким отключением диска. iOS хорошо и действительно ввернута, если у вас заканчивается пространство. Он предупреждает пользователя раньше.Если они игнорируют проблему, они, вероятно, не могли бы запустить ваше приложение. Во-вторых, вы должны рассматривать удаленный объект как зомби. Только вы знаете, что вы отправили зомби к другому методу. Ожидается живой объект. Следовательно, вы нарушаете свой контракт с вызываемым. Вы должны ожидать, что собеседник сломается. – adonoho

Смежные вопросы