Question Comment supprimer tous les objets de mon magasin persistant dans Core Data?


J'ai des données de base fonctionnant dans mon application. Ainsi, je récupère un fichier XML, analyse les données en objets modèles et les insère dans les données de base. Ils sont enregistrés dans le magasin persistant et je peux y accéder lorsque je relance l'application. Cependant, je veux pouvoir actualiser les données dans le magasin persistant à volonté, je dois donc d'abord supprimer les objets existants du magasin. Y a-t-il une méthode simple pour cela?

Merci


J'ai trouvé cette solution:

[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
if ([persistentStoreCoordinator removePersistentStore:persistentStore error:&error])
{
NSURL* storeURL = [NSURL fileURLWithPath:[self pathForPersistentStore]];
[[NSFileManager defaultManager] removeFileAtPath:[storeURL path] handler:nil];
[self addPersistentStore];//recreates the persistent store
}
[managedObjectContext unlock];

15
2018-03-03 23:37


origine


Réponses:


Voici ce que j'ai fait pour nettoyer entièrement mes données de base. Cela fonctionne parfaitement. C'est si vous ne disposez que d'un seul stockage persistant, ce qui est probablement le cas si vous n'en avez pas ajouté un de plus manuellement. Si votre managedObjectContext porte le même nom que celui-ci, vous pouvez simplement le copier / coller.

NSError * error;
// retrieve the store URL
NSURL * storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[managedObjectContext lock];
[managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{
    // remove the file containing the data
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
    //recreate the store like in the  appDelegate method
    [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store
}
[managedObjectContext unlock];
//that's it !

61
2017-12-11 21:28



version rapide de @Nicolas Manzini répond:

if let psc = self.managedObjectContext?.persistentStoreCoordinator{

        if let store = psc.persistentStores.last as? NSPersistentStore{

            let storeUrl = psc.URLForPersistentStore(store)

            self.managedObjectContext?.performBlockAndWait(){

                self.managedObjectContext?.reset()

                var error:NSError?
                if psc.removePersistentStore(store, error: &error){
                    NSFileManager.defaultManager().removeItemAtURL(storeUrl, error: &error)
                    psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: nil, error: &error)
                }
            }
        }
    }

6
2018-05-08 15:55



Sur la base de la réponse de @Nicolas Manzini, j'ai écrit une version de Swift 2.1 avec de petites améliorations. J'ai ajouté une extension à NSManagedObjectContext. Code complet ci-dessous:

import Foundation
import CoreData

extension NSManagedObjectContext
{
    func deleteAllData()
    {
        guard let persistentStore = persistentStoreCoordinator?.persistentStores.last else {
            return
        }

        guard let url = persistentStoreCoordinator?.URLForPersistentStore(persistentStore) else {
            return
        }

        performBlockAndWait { () -> Void in
            self.reset()
            do
            {
                try self.persistentStoreCoordinator?.removePersistentStore(persistentStore)
                try NSFileManager.defaultManager().removeItemAtURL(url)
                try self.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
            }
            catch { /*dealing with errors up to the usage*/ }
        }
    }
}

5
2017-12-31 21:42



Vous pouvez parcourir tous les objets et les supprimer en procédant comme suit:

[managedObjectContext deleteObject:someObject];

Si vous souhaitez supprimer tous les objets, il est probablement plus rapide de supprimer le magasin, puis de recréer la pile CoreData.


1
2018-03-04 00:00



Trash votre fichier de données et le refaire.


1
2018-03-04 00:48



Il y a un fonction

enter image description here

Selon WWDC 242, vous pouvez l'utiliser pour effacer une base de données.

Il y a aussi un func replacePersistentStore qui remplace la base de données actuelle par la base de données sélectionnée.


1
2017-09-14 07:48



Le moyen le plus rapide de tout laisser tomber est d’envoyer le contexte de votre objet géré au réinitialiser message.


-3
2018-03-04 00:27