2009-11-12 165 views
14

有沒有辦法從NSManagedObjectContext刪除所有記錄?刪除NSManagedObjectContext中的所有記錄

我用下面的代碼中插入數據:

NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext]; 
NSManagedObject  * basket = nil; 

basket = [NSEntityDescription insertNewObjectForEntityForName:@"ShoppingBasket" 
             inManagedObjectContext: context]; 
[basket setValue:[firstSelectedObject valueForKey:@"accessoryID"] 
      forKey: @"accessoryID"]; 

如何刪除所有記錄?我想要的東西就像「刪除:」功能,但要刪除所有內容。

回答

39

要刪除給定實體的所有實例(我們將使用您的ShoppingBasket),您可以簡單地獲取所有籃子然後刪除它們。它的代碼,只需幾行:

NSManagedObjectContext * context = [self managedObjectContext]; 
NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease]; 
[fetch setEntity:[NSEntityDescription entityForName:@"ShoppingBasket" inManagedObjectContext:context]]; 
NSArray * result = [context executeFetchRequest:fetch error:nil]; 
for (id basket in result) 
    [context deleteObject:basket]; 

在非基於文檔的應用程序的另一種方法是關閉到數據存儲的連接,刪除實際的文件,然後重新連接(即自帶的模板代碼一個標準的核心數據項目將自動創建文件,如果它不存在)。然後你有一個全新的空店。

請注意,代碼示例會忽略任何可能的錯誤。不要這樣做。 :-)

+1

沒有1代碼行解決方案?即Flush Context,或空的上下文,或deleteAll – aneuryzm 2011-05-11 12:33:01

+0

否。沒有方便的「DROP DATABASE」;站在。 – 2011-05-11 13:16:33

+0

是的,請參閱下面的我的回覆。刪除數據庫,讓我們重新創建它。 – runmad 2012-05-01 18:18:54

5

更快捷的方法就是徹底刪除商店。這樣你就不會浪費任何時間獲取對象,或者像其他答案那樣通過它們枚舉。

NSError *error; 
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyCDStore.sqlite"]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

不要忘記在刪除它後重新創建它。

+0

這種方法使用安全嗎?我們是否可以假設核心數據總是以這個名字保存,這個位置總是? – msk 2012-04-02 13:49:54

+0

是的,如果您使用相同的託管對象上下文重新創建它。 – runmad 2012-04-12 16:21:40

+2

這是假定iOS並忽略OS X基於文檔的數據存儲的問題。你不能只是像這樣敲一個用戶的文檔。 – 2012-05-01 18:40:51