Я искал в SO, но я не нашел никаких предложений по увеличению производительности при удалении управляемого объекта в Core Data при работе с отношениями.Оценка производительности при удалении управляемых объектов с использованием правила Cascade в базовых данных
Сценарий довольно прост.
Как вы можете видеть, существуют три разных объекта. Каждый объект связан в каскаде со следующим. Например, FirstLevel
имеет отношение под названием secondLevels
к SecondLevel
. Правило удаления от FirstLevel
до SecondLevel
: Каскад, а правило удаления от 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 господствовать граф удаляется. Это работает быстро для нескольких объектов, но снижает производительность для многих объектов. Кроме того, я думаю (но я не очень уверен), что этот тип удаления совершает много круговых поездок на диск, я ошибаюсь?
Итак, мой вопрос в следующем: как можно удалить график, не используя Cascade правила и повышения производительности, но в то же время поддерживать согласованность графиков?
Заранее спасибо.
EDIT
Я не могу удалить весь файл, так как у меня есть другие объекты в моей модели.
РЕДАКТИРОВАТЬ 2
кода я разместил обернут в main
методе NSOperation
подкласса. Это решение позволяет исключить фазу удаления в фоновом режиме. Так как я воспользовался Правило каскада, удаление выполняется полуавтоматически. Я удаляю только объекты root, объекты FirstLevel
, с помощью цикла for внутри опубликованного кода. Таким образом, Core Data сделает для меня все остальное. Меня интересует следующее: возможно ли использовать эту операцию полуавтоматического удаления и выполнять ее вручную без потери согласованности графика?
Do tou хотите удалить весь график, я имею в виду, очистить все постоянное хранилище или просто несколько ветвей? –
Весь график. –
Тогда вам это поможет? Http: //stackoverflow.com/questions/3266084/how-to-remove-all-objects-from-core-data –