Я искал в SO, но не нашел никаких предложений по повышению производительности при удалении управляемого объекта в основных данных при работе с отношениями.
Сценарий довольно прост.
Как видите, есть три разных объекта. Каждая сущность связана каскадом со следующей. Например, FirstLevel
имеет отношение, называемое secondLevels
к SecondLevel
. Правило удаления с FirstLevel
по SecondLevel
— Cascade , а правило удаления с SecondLevel
по FirstLevel
— Nullify . Те же правила применяются между SecondLevel
и ThirdLevel
.
Когда я хочу удалить весь граф, я использую следующий метод.:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FirstLevel" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *items = [context executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
// delete roots object and let Core Data to do the rest...
for (NSManagedObject *managedObject in items) {
[context deleteObject:managedObject];
}
Воспользовавшись правилом Cascade , граф удаляется. Это работает быстро для нескольких объектов, но снижает производительность для многих объектов. Кроме того, я думаю (, но я не очень уверен), что этот тип удаления выполняет много циклов обращения к диску. Я ошибаюсь?
Итак, мой вопрос заключается в следующем:как можно удалить график без использования Каскадного правила и повысить производительность, но в то же время сохранить согласованность графика?
Заранее спасибо.
РЕДАКТИРОВАТЬ
Я не могу удалить весь файл, так как в моей модели есть другие объекты.
РЕДАКТИРОВАТЬ 2
Код, который я опубликовал, заключен в метод main
подкласса NSOperation
. Это решение позволяет выполнять фазу удаления в фоновом режиме. Поскольку я воспользовался каскадным правилом , удаление выполняется полуавтоматически. Я удаляю только корневые объекты, элементы FirstLevel
, с помощью цикла for в опубликованном коде. Таким образом, Core Data сделает все остальное за меня.Мне интересно следующее:, возможно ли обойти эту полу-автоматическую операцию удаления и выполнить ее вручную без потери согласованности графа?