2010-03-03 140 views
15

我在我的應用程序的核心數據的工作。因此,我獲取一個XML文件,將數據解析爲模型對象並將其插入到核心數據中。他們被保存在持久存儲中,當我重新啓動應用程序時,我可以訪問它們。但是,我希望能夠隨時刷新持久存儲中的數據,因此我需要先從商店中刪除現有對象。有沒有一個簡單的方法呢?如何從Core Data中的持久性存儲中刪除所有對象?

感謝


我發現這個解決方案:

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

回答

60

這裏是我做了清理我的核心數據完全。它完美的作品。這是如果你只有一個持久存儲,如果你沒有手動添加一個,可能就是這種情況。如果你的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 ! 
+0

非常感謝!一個問題:我們如何在ARC中使用'NSError **錯誤'?它給出錯誤:'指向非const類型的指針'NSError **「沒有明確的所有權」。 – Timo 2012-06-18 00:07:47

+0

是的,你必須聲明它像一些preinfo像_SomethingIDontRemeber NSError **錯誤,或者只是通過零,如果你不想錯誤,它會更容易...;) – 2012-06-18 07:11:59

+7

或者只是改變第一行'NSError *錯誤'和從那時起,參考'錯誤'。 – 2012-11-02 02:30:06

1

你可以通過所有對象循環,並通過這樣做,刪除它們:如果你想刪除所有

[managedObjectContext deleteObject:someObject]; 

對象刪除存儲並重新創建CoreData堆棧可能是最快的。

-3

拋棄一切,最快的方式是送你的管理對象上下文reset消息。

+0

會不會只是空的背景之下,在持久存儲離開我的對象? – conorgriffin 2010-03-04 00:55:24

+0

之後保存上下文。 – Giao 2010-03-04 00:56:26

+7

這是錯的。如果持久存儲中有對象,則這些對象將通過下一個fetchRequest進行重新獲取。重置的所有操作都是使上下文當前擁有的所有對managedObjects的引用無效。 – FelixLam 2010-03-04 09:46:03

1

垃圾數據文件,重新做。

+0

這些步驟是否有更多細節? – David 2015-05-02 19:58:08

+0

它在刪除文件之前存在的私有上下文嘗試保存時崩潰... – zumzum 2015-08-04 22:24:08

6

@Nicolas曼齊尼答案的迅速版本:基於@Nicolas曼齊尼答案

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

我真的需要這個thanx – jhamPac 2015-05-21 20:16:08

5

我已經寫了雨燕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*/ } 
     } 
    } 
} 
+0

完美,正是我所需要的。謝謝! – mattsven 2016-05-18 22:18:05

+0

這個答案大家都在尋找,完美! – dip 2017-03-23 08:39:59

1

有一個function

enter image description here

WWDC 242,你可以用它清理數據庫。

也有一個func replacePersistentStore其與所選擇的一個替換當前數據庫。

相關問題