2010-05-04 4 views
3

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

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

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

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

Спасибо.

ответ

1

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

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

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

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

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

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

+0

Спасибо, я попробую это и опубликую свои результаты. Вызывают ли эти методы удаление объектов из sqlite db? Я не хочу отключать и сиротить объекты. – toofah

+0

Да, объект удален. Но я не понимаю ваш момент: удаление их всех в цикле, а затем сохранение контекста достигает точно такого же эффекта. Единственная разница может быть в выступлениях, и ваши результаты скажут нам, если это так или нет. –

+0

Мне нравятся эти изменения, потому что они, похоже, немного упрощают код, но, похоже, они не исправляют проблемы с производительностью и памятью. Когда я помещал это количество данных в Core Data, я делаю довольно здоровенное управление памятью, чтобы держать вещи под контролем. Может быть, мне нужно будет применить некоторые из тех же принципов здесь: создать собственный NSAutoreleasePool и вымыть его так часто, чтобы избавиться от временных объектов Core Data, также переустановить контекст управляемых объектов на этом этапе, чтобы убедиться, что мы не держимся к ненужным объектам из отношений. Возможно, это ускорит все. – toofah

1

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

1

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

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

[aContext deleteObject:aManagedObject]; 

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

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