Ho cercato all'interno di SO ma non ho trovato alcun suggerimento per migliorare le prestazioni sull'eliminazione di oggetto gestito nei dati principali quando si tratta di relazioni.Considerazioni sulle prestazioni sull'eliminazione di oggetti gestiti utilizzando la regola Cascade nei dati principali
Lo scenario è abbastanza semplice.
Come potete vedere ci sono tre diverse entità. Ogni entità è collegata in cascata con la successiva. Ad esempio, FirstLevel
ha una relazione denominata secondLevels
a SecondLevel
. La regola di cancellazione da FirstLevel
a SecondLevel
è Cascade mentre la regola di cancellazione da SecondLevel
a FirstLevel
è Nullify. Le stesse regole sono applicate tra SecondLevel
e ThirdLevel
.
Quando voglio cancellare l'intero grafico, ho eseguire un metodo come il seguente:
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];
}
Approfittando della Cascade regola il grafico viene rimosso. Funziona velocemente per pochi oggetti ma riduce le prestazioni di molti oggetti. Inoltre, penso (ma non sono molto sicuro) che questo tipo di cancellazione compia molti round trip sul disco, mi sbaglio?
Quindi, la mia domanda è la seguente: come è possibile rimuovere il grafico senza sfruttare Cascade regola e aumentare le prestazioni, ma, allo stesso tempo, mantenere la coerenza grafico?
Grazie in anticipo.
EDIT
Non riesco a cancellare l'intero file dal momento che ho altre entità mio modello.
EDIT 2
Il codice ho postato è avvolto nel metodo di una sottoclasse NSOperation
main
. Questa soluzione consente di eliminare la fase di eliminazione in background. Dal momento che ho sfruttato la Regola Cascade , la cancellazione viene eseguita in modo semi automatico. Elimina solo oggetti root, gli elementi FirstLevel
, tramite il ciclo for all'interno del codice postato. In questo modo Core Data farà il resto per me. Quello che mi chiedo è il seguente: è possibile bybass quella operazione di cancellazione semi-automatica e farlo manualmente senza perdere la consistenza del grafico?
Si desidera eliminare l'intero grafico, cioè cancellare tutto lo store persistente o solo alcuni rami? –
L'intero grafico. –
Allora forse ti sarà d'aiuto? Http: //stackoverflow.com/questions/3266084/how-to-remove-all-objects-from-core-data –