如何从Core Data中的持久性存储中删除所有对象?

我的核心数据在我的应用程序中工作。 所以,我获取一个XML文件,将数据parsing成模型对象并将其插入到核心数据中。 他们被保存在持久存储中,当我重新启动应用程序时,我可以访问它们。 但是,我希望能够随意刷新持久存储中的数据,因此我需要先从存储中删除现有的对象。 有没有一个简单的方法呢?

谢谢


我发现这个解决scheme:

[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]; 

这是我已经完成清理我的核心数据。 它完美的作品。 这是如果你只有一个持久存储,可能是这种情况,如果你没有手动添加一个。 如果你的managedObjectContext与这里有相同的名字,你可以简单地复制/过去它将起作用。

 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 ! 

@Nicolas Manzini的快速版回答:

 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) } } } } 

基于@Nicolas Manzini的回答,我写了一个很小的改进的Swift 2.1版本。 我已经添加了NSManagedObjectContext的扩展。 下面的完整代码:

 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*/ } } } } 

你可以遍历所有的对象并删除它们:

 [managedObjectContext deleteObject:someObject]; 

如果要删除所有对象,删除该存储可能是最快的,然后重新创buildCoreData堆栈。

清理您的数据文件并重新制作。

有一个function

在这里输入图像说明

根据WWDC 242 ,您可以使用它来清除数据库。

另外还有一个func replacePersistentStore ,它将用当前数据库replace当前数据库。

最快的方法是将您的托pipe对象上下文resetreset消息。