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

con*_*fin 16 iphone cocoa-touch core-data ios

我的核心数据在我的应用中运行.因此,我获取XML文件,将数据解析为模型对象并将其插入到核心数据中.它们保存在持久性存储中,我可以在重新启动应用程序时访问它们.但是,我希望能够随意刷新持久存储中的数据,因此我需要先从存储中删除现有对象.对此有直接的方法吗?

谢谢


我找到了这个解决方案

[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];
Run Code Online (Sandbox Code Playgroud)

Nic*_*ini 62

这就是我完全清理核心数据所做的工作.它完美地运作.如果您只有一个持久性存储,如果您没有手动添加一个,则可能就是这种情况.如果您的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 !
Run Code Online (Sandbox Code Playgroud)

  • 或者只是将第一行更改为"NSError*error",然后再引用"&error". (7认同)
  • 请注意,不推荐使用lock.解决方案应该是使用performBlockAndWait: (2认同)

Ben*_*Ben 7

快速版的@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)
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Jul*_*ról 6

根据@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*/ }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)