代码之家  ›  专栏  ›  技术社区  ›  conorgriffin

如何从核心数据的持久存储中删除所有对象?

  •  16
  • conorgriffin  · 技术社区  · 16 年前

    我的应用程序中有核心数据。因此,我获取一个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];
    
    7 回复  |  直到 8 年前
        1
  •  62
  •   Nicolas Manzini    12 年前

    以下是我为彻底清理核心数据所做的工作。它工作得很好。如果只有一个持久性存储,则可能是这样,如果不手动再添加一个持久性存储。如果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 !
    
        2
  •  7
  •   Ben    11 年前

    迅捷版@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)
                    }
                }
            }
        }
    
        3
  •  6
  •   Julian    10 年前

    基于@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*/ }
            }
        }
    }
    
        4
  •  1
  •   Felix Lamouroux    16 年前

    通过执行以下操作,可以循环遍历所有对象并将其删除:

    [managedObjectContext deleteObject:someObject];
    

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

        5
  •  1
  •   Dave DeLong    16 年前

    丢弃数据文件并重新制作。

        6
  •  1
  •   Nike Kov    8 年前

    有一个 function

    enter image description here

    根据 WWDC 242 ,可用于清除数据库。

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

        7
  •  -4
  •   Giao    16 年前

    抛弃一切的最快方法是将托管对象上下文发送给 reset 消息。