2009-11-12 144 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

相关问题