2009-11-12 30 views
14

Esiste un modo per eliminare tutti i record da un NSManagedObjectContext?Elimina tutti i record in NSManagedObjectContext

Sto utilizzando il seguente codice per inserire i dati:

NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext]; 
NSManagedObject  * basket = nil; 

basket = [NSEntityDescription insertNewObjectForEntityForName:@"ShoppingBasket" 
             inManagedObjectContext: context]; 
[basket setValue:[firstSelectedObject valueForKey:@"accessoryID"] 
      forKey: @"accessoryID"]; 

Come faccio a eliminare tutti i record? Voglio qualcosa che sia come la funzione "remove:", ma per rimuovere tutto.

risposta

39

Per eliminare tutte le istanze di una determinata entità (useremo il tuo ShoppingBasket), puoi semplicemente recuperare tutti i cestini e poi eliminarli. E 'solo un paio di righe di codice:

NSManagedObjectContext * context = [self managedObjectContext]; 
NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease]; 
[fetch setEntity:[NSEntityDescription entityForName:@"ShoppingBasket" inManagedObjectContext:context]]; 
NSArray * result = [context executeFetchRequest:fetch error:nil]; 
for (id basket in result) 
    [context deleteObject:basket]; 

L'alternativa in un'applicazione basata su non-documento è quello di spegnere il collegamento all'archivio dati, eliminare il file vero e proprio, quindi ricollegare (il codice del modello che viene fornito con un progetto Core Data standard creerà automaticamente il file se è assente). Quindi hai un nuovo negozio vuoto.

Nota: l'esempio di codice ignora qualsiasi possibile errore. Non farlo. :-)

+1

Non c'è una soluzione a 1 linea di codice? Ad esempio il contesto di flusso o il contesto vuoto o deleteAll – aneuryzm

+0

No. Nessun comodo "DROP DATABASE;" controfigura. –

+0

Sì, c'è, vedere la mia risposta qui sotto. Elimina il database e ti consente di ricrearlo. – runmad

5

Un modo molto più rapido sarebbe quello di rimuovere completamente il negozio. In questo modo non stai perdendo tempo a cercare oggetti, o elencando attraverso di essi come fa l'altra risposta.

NSError *error; 
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyCDStore.sqlite"]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

Non dimenticare di ricrearlo dopo averlo eliminato.

+0

Questo metodo è sicuro da usare? Possiamo supporre che i dati principali verranno sempre salvati con questo nome, questa posizione sempre? – msk

+0

Sì, se si sta utilizzando lo stesso contesto dell'oggetto gestito per ricrearlo. – runmad

+2

Questo presuppone iOS e trascura i problemi con gli archivi dati basati su documenti OS X. Non puoi semplicemente colpire un documento di un utente come questo. –