2009-11-12 7 views
14

Existe-t-il un moyen de supprimer tous les enregistrements d'un NSManagedObjectContext?Supprimer tous les enregistrements dans NSManagedObjectContext

J'utilise le code suivant pour insérer des données:

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

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

Comment puis-je supprimer tous les enregistrements? Je veux quelque chose qui ressemble à la fonction "remove:", mais pour tout enlever.

Répondre

39

Pour supprimer toutes les instances d'une entité donnée (nous utiliserons votre ShoppingBasket), vous pouvez simplement récupérer tous les paniers puis les supprimer. Il est juste quelques lignes de code:

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'alternative dans une application à base non-document est de fermer la connexion au magasin de données, supprimez le fichier réel, puis reconnectez (le code du modèle qui vient avec un projet Core Data standard créera automatiquement le fichier s'il est absent). Vous avez alors un tout nouveau magasin vide.

Notez que l'exemple de code ignore toute erreur possible. Ne fais pas ça. :-)

+1

Il n'y a pas 1 solution de ligne de code? c'est-à-dire le contexte de vidage, ou le contexte vide, ou supprimer tout – aneuryzm

+0

Nope. Pas de "DROP DATABASE" pratique; stand-in. –

+0

Oui, il y a, voir ma réponse ci-dessous. Supprime la base de données et vous permet de la recréer. – runmad

5

Un moyen beaucoup plus rapide serait de supprimer entièrement le magasin. De cette façon, vous ne perdez pas de temps à aller chercher des objets, ou à les énumérer comme le fait l'autre réponse.

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

N'oubliez pas de le recréer après l'avoir supprimé.

+0

Cette méthode est-elle sûre à utiliser? Pouvons-nous supposer que les données de base seront toujours enregistrées avec ce nom, cet emplacement toujours? – msk

+0

Oui, si vous utilisez le même contexte d'objet géré pour le recréer. – runmad

+2

Cela suppose iOS et néglige les problèmes avec les magasins de données OS X basés sur des documents. Vous ne pouvez pas simplement écraser le document d'un utilisateur comme ça. –

Questions connexes