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

时间:2010-03-03 23:37:43

标签: ios iphone cocoa-touch core-data

我的核心数据在我的应用中运行。因此,我获取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];

8 个答案:

答案 0 :(得分: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 !

答案 1 :(得分: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)
                }
            }
        }
    }

答案 2 :(得分: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*/ }
        }
    }
}

答案 3 :(得分:1)

您可以遍历所有对象并通过执行以下操作删除它们:

[managedObjectContext deleteObject:someObject];

如果要删除所有对象,可能最快删除商店,然后重新创建CoreData堆栈。

答案 4 :(得分:1)

将您的数据文件存档并重新制作。

答案 5 :(得分:1)

有一个function

enter image description here

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

还有一个func replacePersistentStore正在用选定的数据库替换当前数据库。

答案 6 :(得分:1)

import Foundation
import CoreData

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

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

        performAndWait { () -> Void in
            self.reset()
             do
            {
                try self.persistentStoreCoordinator?.remove(persistentStore)
                try FileManager.default.removeItem(at: url)
                try self.persistentStoreCoordinator?.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
             }
            catch { /*dealing with errors up to the usage*/ }
         }
    }
}

感谢@Julian Krol-更新了Swift 5.1的答案

答案 7 :(得分:-4)

抛弃所有内容的最快方法是向您的托管对象上下文发送reset消息。