Szukałem w ramach SO, ale nie znalazłem żadnych sugestii, aby zwiększyć wydajność usuwania obiektu zarządzanego w danych podstawowych podczas rozwiązywania relacji.Uwagi dotyczące wydajności podczas usuwania obiektów zarządzanych przy użyciu reguły Cascade w danych podstawowych
Scenariusz jest dość prosty.
Jak widać, istnieją trzy różne jednostki. Każda jednostka jest połączona kaskadowo z kolejną. Na przykład FirstLevel
ma relację o nazwie secondLevels
do SecondLevel
. Reguła usuwania z FirstLevel
do SecondLevel
to Cascade, podczas gdy reguła usuwania z SecondLevel
do FirstLevel
to Nullify. Te same zasady są stosowane między SecondLevel
i ThirdLevel
.
Kiedy usunąć cały wykres, że wykonuje sposób jak poniżej:
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];
}
Wykorzystując Cascade wykluczyć wykres jest usuwany. Działa to szybko dla kilku obiektów, ale zmniejsza wydajność dla wielu obiektów. Poza tym uważam (ale nie jestem tego pewien), że tego typu usuwanie wykonuje wiele podróży w obie strony na dysk, czy jestem w błędzie?
Moje pytanie brzmi: jak można usunąć wykres bez korzystania z zasady i zwiększenia wydajności, ale jednocześnie zachować spójność wykresów?
Z góry dziękuję.
EDIT
nie mogę usunąć cały plik, ponieważ mam inne podmioty w moim modelu.
EDIT 2
kod I wysłane jest owinięta w sposobem obejmującym NSOperation
podklasy main
. To rozwiązanie pozwala wyeliminować fazę usuwania w tle. Ponieważ skorzystałem z Cascade Rule, usunięcie odbywa się w sposób półautomatyczny. Usuwam tylko obiekty główne, elementy FirstLevel
, za pomocą pętli for w ramach opublikowanego kodu. W ten sposób Core Data zrobi dla mnie resztę. Zastanawiam się, co następuje: czy można obejść tę półautomatyczną operację usuwania i zrobić to ręcznie bez utraty spójności wykresu?
Czy chcesz usunąć cały wykres, to znaczy usunąć cały trwały sklep lub tylko niektóre gałęzie? –
Cały wykres. –
Może to ci pomóc? Http: //stackoverflow.com/questions/3266084/how-to-remove-all-objects-from-core-data –