Производительность Core Data deleteObject и сохранение контекста управляемого объекта - PullRequest
3 голосов
/ 04 мая 2010

Я пытаюсь найти лучший способ массового удаления объектов в моей базе данных Core Data.

У меня есть несколько объектов с отношениями родитель / ребенок. Иногда мне нужно «обновить» родительский объект, очистив все существующие дочерние объекты и добавив новые в базовые данные. В части «удалить все» этой операции возникают проблемы. Я выполняю это, перебирая детей и вызывая deleteObject для каждого из них.

Я заметил, что после NSManagedObjectContext: сохранение вызова после всех вызовов deleteObject происходит очень медленно, когда я удаляю 15 000 объектов.

Как я могу ускорить этот звонок? Происходят ли какие-либо события во время операции сохранения, о которых я могу знать и которых можно избежать, задавая другие параметры или настраивая мою модель другим способом? Я заметил, что во время этой операции всплывает память. Я действительно просто хочу "удалить * из".

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 мая 2010

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

NSManagedObject *parentObject = ...;
[parentObject setValue:nil forKey:@"children"];

или с использованием метода сгенерированных базовых данных

- (void)removeChildren:(NSSet *)value;

NSSet *children = [parentObject valueForKey:@"children"];
[parentObject removeChildren:children];

Я не уверен, ускорит ли это операцию сохранения NSManagedObjectContext. Пожалуйста, дайте мне знать о спектаклях.

1 голос
/ 16 января 2012

по данным сайта Apple: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdCreateMOs.html это очень просто:

Удалить управляемый объект просто. Вы просто отправляете его контекст управляемого объекта сообщение deleteObject:, передавая объект, который вы хотите удалить, в качестве аргумента.

[aContext deleteObject:aManagedObject];

Это удаляет управляемый объект из графа объектов. Так же, как новый объект не сохраняется в хранилище до тех пор, пока не будет сохранен контекст, удаленный объект не удаляется из хранилища, пока не будет сохранен контекст.

1 голос
/ 04 мая 2010

Проверьте граф зависимостей отношений: каскад удалений, вызванный первоначальным удалением, замедлит процесс. Если эти удаления не нужны, измените правило удаления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...