Supprimer/Réinitialiser toutes les entrées dans les données de base?

savez-vous comment supprimer toutes les entrées stockées dans les données de base? Mon schéma devrait rester le même; je veux juste le réinitialiser à blanc.


modifier

je cherche à faire cela programmatiquement de sorte qu'un utilisateur puisse essentiellement appuyer sur un bouton reset .

222
demandé sur Michael Grinich 2009-07-03 08:55:28

29 réponses

vous pouvez toujours supprimer le fichier programmatiquement, en utilisant la méthode NSFileManager:removeItemAtPath::.

NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

ensuite, il suffit d'ajouter le magasin persistant en arrière pour s'assurer qu'il est recréé correctement.

la méthode programmatique pour itérer à travers chaque entité est à la fois plus lente et sujette à erreur. L'utiliser pour faire de cette façon, si vous voulez supprimer des entités et pas d'autres. Cependant, vous devez toujours vous assurer de conserver le référentiel l'intégrité ou vous ne pourrez pas persister dans vos changements.

simplement enlever le magasin et le recréer est à la fois rapide et sûr, et peut certainement être fait programmatiquement à l'exécution.

mise à jour pour iOS5+

avec l'introduction du stockage binaire externe (allowsexternalbinarydastorage ou Store in External Record File) dans iOS 5 et OS X 10.7, il ne suffit pas de supprimer des fichiers pointés par storeURLs. Vous laisserez les fichiers externes derrière vous. Puisque le schéma de nommage de ces fichiers externes n'est pas public, Je n'ai pas encore de solution universelle. - an0 mai 8 ' 12 à 23: 00

194
répondu groundhog 2013-01-08 11:42:40

vous pouvez supprimer le fichier sqllite - mais je choisis de le faire en purgeant les tables individuellement avec une fonction:

- (void) deleteAllObjects: (NSString *) entityDescription  {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];


    for (NSManagedObject *managedObject in items) {
        [_managedObjectContext deleteObject:managedObject];
        DLog(@"%@ object deleted",entityDescription);
    }
    if (![_managedObjectContext save:&error]) {
        DLog(@"Error deleting %@ - error:%@",entityDescription,error);
    }

}

la raison pour laquelle j'ai choisi de le faire table par table est qu'il me fait confirmer comme je fais la programmation que la suppression du contenu de la table est raisonnable et il n'y a pas de données que je préférerais garder.

faire cela sera beaucoup plus lent que la suppression du fichier et je changerai à un fichier supprimer si je cette méthode prend trop de temps.

139
répondu Grouchal 2009-07-03 08:12:23

solution mise à jour pour iOS 9+

utiliser NSBatchDeleteRequest pour supprimer tous les objets de l'entité sans avoir à les charger en mémoire ou à les itérer.

// create the delete request for the specified entity
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer

// perform the delete
do {
    try persistentContainer.viewContext.execute(deleteRequest)
} catch let error as NSError {
    print(error)
}

ce code a été mis à jour pour iOS 10 et Swift 3. Si vous avez besoin de support iOS 9, Voir cette question .

Sources:

48
répondu Suragch 2017-05-23 11:47:19

j'ai écrit une méthode clearStores qui passe par chaque magasin et la supprime à la fois du coordinateur et du système de fichiers (traitement des erreurs laissé de côté):

NSArray *stores = [persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}

[persistentStoreCoordinator release], persistentStoreCoordinator = nil;

cette méthode fait partie d'une classe coreDataHelper qui s'occupe (entre autres choses) de créer le persistentStore quand il est nul.

36
répondu samvermette 2010-06-10 05:30:40

je supprime toutes les données des données de base sur un événement bouton dans une classe HomeViewController: Cet article m'a tellement aidé que j'ai pensé y contribuer.

-(IBAction)buttonReset:(id)sender
{
    NSLog(@"buttonReset Pressed");

    //Erase the persistent store from coordinator and also file manager.
    NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
    NSError *error = nil;
    NSURL *storeURL = store.URL;
    [self.persistentStoreCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];


    NSLog(@"Data Reset");

    //Make new persistent store for future saves   (Taken From Above Answer)
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // do something with the error
    }

}

notez que pour s'appeler soi-même.persistentStoreCoordinator i a déclaré une propriété dans le contrôleur Home View. (Ne vous inquiétez pas au sujet de la managedObjectContext que j'utilise pour la sauvegarde et le chargement.)

@property (nonatomic, retain) NSManagedObjectContext        *   managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator  *   persistentStoreCoordinator;

puis dans la demande D'autorisation a été Finishlaunching droit ci-dessous creating a home ViewController I have:

homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;
27
répondu atreat 2012-08-03 21:23:01

MagicalRecord rend cela très facile.

[MyCoreDataObject MR_truncateAll];
20
répondu Brian King 2014-03-01 03:32:30

[réponse tardive en réponse à une prime demandant des réponses plus récentes]

la Recherche sur les réponses précédentes,

  • récupérer et supprimer tous les articles, comme suggéré par @Grouchal et d'autres, est toujours une solution efficace et utile. Si vous avez de très grands magasins de données alors il pourrait être lent, mais il fonctionne toujours très bien.
  • supprimer simplement la Data store est, comme vous et @groundhog notez, Non plus efficace. C'est obsolète même si vous n'utilisez pas de stockage binaire externe parce que iOS 7 utilise le mode WAL pour le journallage SQLite. Avec le mode WAL il peut y avoir des fichiers de journal (potentiellement grands) autour de n'importe quelle mémoire persistante de données de base.

mais il y a une approche différente et similaire pour enlever le magasin persistant qui fonctionne. La clé est de mettre votre fichier de stockage persistant dans son propre sous-répertoire qui ne contient pas quelque chose d'autre. Ne le mettez pas simplement dans le répertoire des documents (ou n'importe où), créez un nouveau sous-répertoire juste pour le magasin persistant. Le contenu de ce répertoire finira par être le fichier de stockage persistant, les fichiers de journal, et les fichiers binaires externes. Si vous voulez atomiser tout le magasin de données, supprimez ce répertoire et ils vont tous disparaître.

vous feriez quelque chose comme ça en mettant en place votre magasin persistant:

NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
        withIntermediateDirectories:NO
        attributes:nil
        error:nil]) {
    NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
    // continue with storeURL as usual...
}

alors quand vous avez voulu enlever le magasin,

[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];

qui supprime récursivement à la fois le sous-répertoire personnalisé et tous les fichiers de données de base qu'il contient.

cela ne fonctionne que si vous n'avez pas déjà votre mémoire persistante dans le même dossier que d'autres données importantes . Comme le répertoire des documents, qui contient probablement d'autres documents utiles. Si c'est votre situation, vous pourriez obtenir le même effet en recherchant des fichiers que vous faire souhaitez conserver et supprimer tout ce qui reste. Quelque chose comme:

NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
    // Look at docsDirectoryItem. If it's something you want to keep, do nothing.
    // If it's something you don't recognize, remove it.
}

cette approche peut être sujette à erreur . Vous devez être absolument sûr que vous connaissez chaque fichier que vous voulez garder, parce que sinon vous pourriez supprimer des données importantes. D'un autre côté, vous pouvez supprimer les fichiers binaires externes sans réellement connaître le nom du fichier/répertoire utilisé pour les stocker.

13
répondu Tom Harrington 2013-12-05 21:12:06

iOS9+, Swift 2

supprimer tous les objets dans toutes les entités

func clearCoreDataStore() {
    let entities = managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.executeRequest(deleteReqest)
        } catch {
            print(error)
        }
    }
}
13
répondu Andres Wang 2016-05-20 13:55:06

si vous voulez supprimer tous les objets et ne voulez pas supprimer les fichiers de soutien, vous pouvez utiliser les méthodes suivantes:

- (void)deleteAllObjectsInContext:(NSManagedObjectContext *)context
                       usingModel:(NSManagedObjectModel *)model
{
    NSArray *entities = model.entities;
    for (NSEntityDescription *entityDescription in entities) {
        [self deleteAllObjectsWithEntityName:entityDescription.name
                                   inContext:context];
    }
}

- (void)deleteAllObjectsWithEntityName:(NSString *)entityName
                             inContext:(NSManagedObjectContext *)context
{
    NSFetchRequest *fetchRequest =
        [NSFetchRequest fetchRequestWithEntityName:entityName];
    fetchRequest.includesPropertyValues = NO;
    fetchRequest.includesSubentities = NO;

    NSError *error;
    NSArray *items = [context executeFetchRequest:fetchRequest error:&error];

    for (NSManagedObject *managedObject in items) {
        [context deleteObject:managedObject];
        NSLog(@"Deleted %@", entityName);
    }
}

attention, il peut être très lent (dépend de combien d'objets sont dans votre graphe d'objet).

10
répondu Marián Černý 2013-02-22 17:48:41

Voici une solution combinée pour purger les données de base.

- (void)deleteAllObjectsInCoreData
{
    NSArray *allEntities = self.managedObjectModel.entities;
    for (NSEntityDescription *entityDescription in allEntities)
    {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:entityDescription];

        fetchRequest.includesPropertyValues = NO;
        fetchRequest.includesSubentities = NO;

        NSError *error;
        NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

        if (error) {
                NSLog(@"Error requesting items from Core Data: %@", [error localizedDescription]);
            }

        for (NSManagedObject *managedObject in items) {
            [self.managedObjectContext deleteObject:managedObject];
        }

        if (![self.managedObjectContext save:&error]) {
            NSLog(@"Error deleting %@ - error:%@", entityDescription, [error localizedDescription]);
        }
    }  
}
10
répondu GxocT 2013-10-10 09:06:44

si vous voulez aller à la route supprimer tous les objets (ce qui est beaucoup plus simple que de détruire la pile de données de base, mais moins performant), que ce est une meilleure mise en œuvre:

- (void)deleteAllManagedObjectsInModel:(NSManagedObjectModel *)managedObjectModel context:(NSManagedObjectContext *)managedObjectContext
{
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [managedObjectContext performBlockAndWait:^{
            for (NSEntityDescription *entity in managedObjectModel) {
                NSFetchRequest *fetchRequest = [NSFetchRequest new];
                [fetchRequest setEntity:entity];
                [fetchRequest setIncludesSubentities:NO];
                NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
                for (NSManagedObject *managedObject in objects) {
                    [managedObjectContext deleteObject:managedObject];
                }            
            }

            [managedObjectContext save:nil];
        }];
    }];
    [operation setCompletionBlock:^{
        // Do stuff once the truncation is complete
    }];
    [operation start];
}

cette implémentation utilise NSOperation pour effectuer la suppression hors du thread principal et notifier à l'achèvement. Vous pouvez vouloir émettre une notification ou quelque chose dans le bloc d'achèvement de bulle de l'état de retour au fil principal.

6
répondu Blake Watters 2014-01-07 04:00:35

iOS 10 + Solution Swift 3:

func clearCoreDataStore() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

    for i in 0...delegate.persistentContainer.managedObjectModel.entities.count-1 {
        let entity = delegate.persistentContainer.managedObjectModel.entities[i]

        do {
            let query = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
            let deleterequest = NSBatchDeleteRequest(fetchRequest: query)
            try context.execute(deleterequest)
            try context.save()

        } catch let error as NSError {
            print("Error: \(error.localizedDescription)")
            abort()
        }
    }
}

itère à travers toutes les entités de données de base et les efface

5
répondu KVISH 2016-10-02 21:11:38

Voici une version quelque peu simplifiée avec moins d'appels vers AppDelegate self et le dernier morceau de code qui a été omis de la réponse la mieux cotée. Aussi je recevais une erreur "le magasin persistant de L'objet n'est pas accessible à partir du coordinateur de NSManagedObjectContext" donc juste besoin d'ajouter que retour.

NSPersistentStoreCoordinator *storeCoordinator = [self persistentStoreCoordinator];
NSPersistentStore *store = [[storeCoordinator persistentStores] lastObject];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dataModel"];
NSError *error;

[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];

if (storeCoordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:storeCoordinator];
}
4
répondu Alberto Lopez 2012-11-08 17:13:43

solution swift:

class func deleteAllManagedObjects() {

        let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "mom")
        let mom = NSManagedObjectModel(contentsOfURL: modelURL)

        for entityName in mom.entitiesByName.keys {
            let fr = NSFetchRequest(entityName: entityName as String)
            let a = Utility.managedObjectContext().executeFetchRequest(fr, error: nil) as [NSManagedObject]
            for mo in a {
                Utility.managedObjectContext().deleteObject(mo)
            }
        }

        Utility.managedObjectContext().save(nil)
    }
4
répondu János 2014-09-06 08:18:30

comme une référence rapide pour sauver la recherche ailleurs-recréer le magasin persistant après l'avoir supprimé peut être fait avec:

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
3
répondu TimD 2011-09-29 09:43:52

Merci pour le post. Je l'ai suivi et il a travaillé pour moi. Mais j'ai eu un autre problème qui n'a été mentionné dans aucune des réponses. Donc je ne suis pas sûr que ce soit juste moi.

de toute façon, je pensais poster ici le problème et ma façon de le résoudre.

j'avais quelques enregistrements dans la base de données, je voulais tout purger avant d'écrire de nouvelles données à la db, donc j'ai tout fait y compris

[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 

et ensuite utilisé managedObjectContext pour accéder à la base de données (censée être vide maintenant), les données étaient toujours là. Après un certain temps de dépannage, j'ai trouvé que je dois réinitialiser managedObjectContext , managedObject , managedObjectModel et persistentStoreCoordinator , avant d'utiliser managedObjectContext pour accéder à la base de données. Maintenant, j'ai une base de données à écrire.

3
répondu DanielZ 2011-12-12 22:15:08

Plusieurs bonnes réponses à cette question. Voici une belle concis. Les deux premières lignes suppriment la base de données sqlite. Ensuite, la boucle for: supprime tous les objets de la mémoire managedObjectContext.

NSURL *storeURL = [[(FXYAppDelegate*)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
    [self.managedObjectContext deleteObject:ct];
}
3
répondu adamek 2012-08-05 00:19:27

vous pouvez également trouver tous les noms d'entités, et les supprimer par leur nom. C'est une version plus longue mais fonctionne bien, de cette façon vous n'avez pas à travailler avec persistence store

 - (void)clearCoreData
{
NSError *error;
NSEntityDescription *des = [NSEntityDescription entityForName:@"Any_Entity_Name" inManagedObjectContext:_managedObjectContext];
NSManagedObjectModel *model = [des managedObjectModel];
NSArray *entityNames = [[model entities] valueForKey:@"name"];

for (NSString *entityName in entityNames){

    NSFetchRequest *deleteAll = [NSFetchRequest fetchRequestWithEntityName:entityName];
    NSArray *matches = [self.database.managedObjectContext executeFetchRequest:deleteAll error:&error];

}
    if (matches.count > 0){
        for (id obj in matches){

            [_managedObjectContext deleteObject:obj];
        }
       [self.database.managedObjectContext save:&error];
    }
}

pour "Any_Entity_Name", il suffit de donner le nom de votre entité, il suffit de comprendre la description de l'entité dans laquelle se trouvent vos entités. ValueForKey@ "name" renverra tous les noms d'entités. Enfin, n'oubliez pas d'enregistrer.

2
répondu Chris Lin 2013-01-22 04:29:25

la réponse acceptée est correcte avec suppression de L'URL par NSFileManager est correcte, mais comme indiqué dans iOS 5+ edit, le magasin persistant n'est pas représenté par un seul fichier. Pour le magasin SQLite c'est *.sqlite,*.sqlite-shm et *.sqlite-wal ... heureusement depuis iOS 7+ Nous pouvons utiliser la méthode

[NSPersistentStoreCoordinator +removeUbiquitousContentAndPersistentstoreaturl:options:erreur:]

pour prendre soin de l'enlèvement, de sorte que le le code devrait être quelque chose comme ceci:

NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSString *storeName = ...;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL.path options:@{NSPersistentStoreUbiquitousContentNameKey: storeName} error:&error];
2
répondu JakubKnejzlik 2015-04-21 11:12:56

supprimer le fichier de stockage persistant et configurer un nouveau coordinateur de stockage persistant?

0
répondu Hunter 2009-07-03 05:09:26

Supprimer sqlite à partir de votre fileURLPath et puis de construire.

0
répondu Jai 2009-07-03 11:56:15

en supposant que vous utilisez MagicalRecord et que vous avez un stock de persistance par défaut:

Je n'aime pas toutes les solutions qui supposent que certains fichiers existent et/ou demandent l'entrée des noms d'entités ou des classes. Il s'agit d'un moyen sûr Swift(2) pour supprimer toutes les données de toutes les entités. Après la suppression, il va recréer une nouvelle pile aussi (je ne suis pas vraiment sûr de la nécessité de cette partie).

c'est godo pour les situations de style "logout" quand vous vous voulez tout supprimer, mais avoir un magasin de travail et moc pour obtenir de nouvelles données dans (une fois que l'utilisateur se connecte...)

extension NSManagedObject {

    class func dropAllData() {

        MagicalRecord.saveWithBlock({ context in

            for name in NSManagedObjectModel.MR_defaultManagedObjectModel().entitiesByName.keys {
                do { try self.deleteAll(name, context: context) }
                catch { print("⚠️ ✏️ Error when deleting \(name): \(error)") }
            }

            }) { done, err in
                MagicalRecord.cleanUp()
                MagicalRecord.setupCoreDataStackWithStoreNamed("myStoreName")
        }
    }

    private class func deleteAll(name: String, context ctx: NSManagedObjectContext) throws {
        let all = NSFetchRequest(entityName: name)
        all.includesPropertyValues = false

        let allObjs = try ctx.executeFetchRequest(all)
        for obj in allObjs {
            obj.MR_deleteEntityInContext(ctx)
        }

    }
}
0
répondu Aviel Gross 2015-11-08 16:20:41

utiliser cette

+(NSArray *)fetchDataFromEntity:(NSString *)entityName context:(NSManagedObjectContext *)context
{
    NSFetchRequest * fetchRequest =[[NSFetchRequest alloc] init];
    NSEntityDescription * CategoriesEntity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    [fetchRequest setEntity:CategoriesEntity];

    NSError * error;
    NSInteger count = [context countForFetchRequest:fetchRequest error:&error];

    if (count && count>0) {

        NSArray * fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects && fetchedObjects.count>0) {

            return fetchedObjects;
        }else
            return nil;

    }
    else
        return nil;
}
+ (void)deleteObjectsOfArray:(NSMutableArray*)ary context:(NSManagedObjectContext *)context {
    for (NSManagedObject * obj in ary) {
        [context deleteObject:obj];
    }
    NSError *saveError = nil;
    [context save:&saveError];
}
+ (void)deleteEntity:(NSString *)entityName context:(NSManagedObjectContext *)context {
    NSArray *listArray = [self fetchDataFromEntity:entityName context:context];
    [self deleteObjectsOfArray:[NSMutableArray arrayWithArray:listArray] context:context];
}
0
répondu Sandeep Singh 2016-02-16 06:46:33

j'ai pris le code de Grouchal et pour l'accélérer j'ai utilisé l'énumération en mode concurrent ( NSEnumerationConcurrent ), il est devenu un peu plus rapide par rapport à la boucle (dans mon application j'ai ajouté cette fonctionnalité pour les testeurs afin qu'ils puissent Effacer les données et faire des testcases plutôt que supprimer et installer app)

- (void)resetObjects
{
    [self deleteAllObjectsInEntity:@"Entity1"];
    [self deleteAllObjectsInEntity:@"Entity2"];
    [self deleteAllObjectsInEntity:@"Entity3"];
    [self deleteAllObjectsInEntity:@"Entity4"];
}

-(void) deleteAllObjectsInEntity:(NSString*) entityName
{
    MainDataContext *coreDataContext = [MainDataContext sharedInstance];
    NSManagedObjectContext *currentContext = coreDataContext.managedObjectContext;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:currentContext];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *items = [currentContext executeFetchRequest:fetchRequest error:&error];

    [items enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSManagedObject * obj, NSUInteger idx, BOOL *stop) {
        [currentContext deleteObject:obj];
    }];


    if (![currentContext save:&error]) {
        NSLog(@"Error deleting %@ - error:%@",entityName,error);
    }
}
0
répondu anoop4real 2016-03-04 13:19:37

voici ma version swift3 pour supprimer tous les enregistrements. Les "utilisateurs" est le nom de l'entité

@IBAction func btnDelAll_touchupinside(_ sender: Any) {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedObjectContext = appDelegate.persistentContainer.viewContext

    let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    let req = NSBatchDeleteRequest(fetchRequest: fetchReq)

    do {
        try managedObjectContext.execute(req)

    } catch {
        // Error Handling
    }   
}
0
répondu Kursat Turkay 2017-02-25 14:30:19

fonctionne avec toutes les versions. Passer le nom de l'entité et parcourir pour supprimer toutes les entrées et enregistrez le contexte.

func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
    var context = NSManagedObjectContext()
    if #available(iOS 10.0, *) {
        context = self.persistentContainer.viewContext
    } else {
        context = self.managedObjectContext
    }

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
    fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
    fetchRequest.includesPropertyValues = false
    do {
        let results = try context.fetch(fetchRequest) as! [NSManagedObject]
        for result in results {
            context.delete(result)
        }
        try context.save()
        completion(true)
    } catch {
        completion(false)
        print("fetch error -\(error.localizedDescription)")
    }
}
0
répondu Karun Kumar 2017-03-02 12:19:39

iOS 10 et Swift 3

en supposant que votre nom d'entité est "Photo", et que vous créez une classe CoreDataStack...

 func clearData() {
        do {            
            let context = CoreDataStack.sharedInstance.persistentContainer.viewContext
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Photo")
            do {
                let objects  = try context.fetch(fetchRequest) as? [NSManagedObject]
                _ = objects.map{"151900920".map{context.delete("151900920")}}
                CoreDataStack.sharedInstance.saveContext()
            } catch let error {
                print("ERROR DELETING : \(error)")
            }
        }
    }

voici un bon tutoriel sur comment utiliser CoreData et comment utiliser cette méthode. https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f#.1tu6kt8qb

0
répondu James Rochabrun 2017-03-15 05:16:18

Voici une version qui efface chaque enregistrement dans chaque table que vous avez.

Swift 4

static func resetDatabase() {
    do {
        try dataStore.persistentStoreCoordinator.managedObjectModel.entities.forEach { (entity) in
            if let name = entity.name {
                let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: name)
                let request = NSBatchDeleteRequest(fetchRequest: fetch)
                try mainContext.execute(request)
            }
        }

        try mainContext.save()
    } catch {
        print("error resenting the database: \(error.localizedDescription)")
    }
}
0
répondu Politta 2018-03-07 03:27:11

vous faites tous paraître ça compliqué. Vous pouvez simplement envoyer votre NSManagedObjectContext la méthode de réinitialisation

-8
répondu Master J 2012-03-12 01:29:10