【问题标题】:Delete all records in NSManagedObjectContext删除 NSManagedObjectContext 中的所有记录
【发布时间】:2010-12-16 01:54:33
【问题描述】:

有没有办法从NSManagedObjectContext 中删除所有记录?

我正在使用以下代码插入数据:

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

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

如何删除所有记录?我想要类似于“删除:”功能的东西,但要删除所有内容。

【问题讨论】:

    标签: cocoa core-data records


    【解决方案1】:

    一种更快的方法是完全删除商店。这样你就不会浪费任何时间来获取对象,或者像其他答案那样枚举它们。

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

    删除后不要忘记重新创建它。

    【讨论】:

    • 这种方法使用安全吗?我们是否可以假设核心数据将始终使用此名称、此位置保存?
    • 是的,如果您使用相同的托管对象上下文来重新创建它。
    • 这假设 iOS 并忽略了 OS X 基于文档的数据存储的问题。你不能像这样直接修改用户的文档。
    • Joshua Nozzi 无法更好地解释为什么你的反应不好
    • 我将如何重新创建它?
    【解决方案2】:

    要删除给定实体的所有实例(我们将使用您的 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];
    

    非基于文档的应用程序中的替代方法是关闭与数据存储的连接,删除实际文件,然后重新连接(标准 Core Data 项目附带的模板代码将自动创建文件,如果缺席的)。然后你就有了一个全新的空店。

    注意,代码示例忽略了任何可能的错误。不要那样做。 :-)

    【讨论】:

    • 没有 1 行代码解决方案?即Flush Context,或空上下文,或deleteAll
    • 不。没有方便的“DROP DATABASE;”替身。
    • 是的,请参阅下面的回复。删除数据库,让我们重新创建它。
    • 请阅读我的实际帖子。我特别指出你可以做你在回答中提到的同样的事情,但这不适用于 OS X 上基于文档的应用程序。由于 OP 说的是 Cocoa 而不是 Cocoa Touch 或 iOS,我的回答是合适的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多