【问题标题】:Cocoa-Touch, Core Data: How do I delete all objects for an entity?Cocoa-Touch,核心数据:如何删除实体的所有对象?
【发布时间】:2010-12-07 03:34:29
【问题描述】:

我有一个应用,将 Core Data 与 SQLite 商店结合使用。

有时我想删除一些实体的所有对象。可能有近千个对象。

根据我通过 google 和官方文档了解到的情况,删除对象的唯一方法是对每个对象使用 [managedObjectContext deleteObject:(Entity *)]。但这意味着我必须先获取所有对象。

数据存储只是sqlite,没有办法简单地将TRUNCATE TABLE ZENTITY;传递给它吗?

【问题讨论】:

    标签: objective-c iphone cocoa-touch core-data


    【解决方案1】:

    问题在于 CoreData 不仅仅是一个 SQLite 包装器。这是一个对象图管理解决方案,除了其他内容之外,它还将对象的缓存版本存储在内存中。据我所知,要删除给定托管对象的所有实例,您必须获取它们然后删除每个实例。这并不是说这个功能不应该存在,因为它可能应该存在。

    【讨论】:

      【解决方案2】:

      您是否真的尝试过并发现这是一个性能问题?如果是这样,那么您可以提供一些信息来表明这一点,更重要的是提交一份错误报告。如果不是,那你为什么还要问呢?

      这不像TRUNCATE TABLE ZENTITY; 那样简单,因为Core Data 还必须为每个对象应用删除规则(以及其他操作),这意味着进行提取。所以他们也可以让你进行提取,然后将结果一个接一个地传递到上下文中。

      【讨论】:

      • 我问是因为我发现从数据库中获取大约 1k 行是不好的,而您只想删除它们。我还没有为它做基准测试,但即使 Core Data 对所有对象进行延迟加载,我仍然希望能够在表上进行截断,因为这甚至不需要先计数。
      • 用繁琐的方式做事总是不好的解决办法,有没有相关的性能问题也没关系。
      • 虽然这不是特别麻烦。它使 Core Data API 保持精简,并且非常清楚您的代码在做什么。 是的如果存在性能问题,那很糟糕,但您需要先对其进行衡量。
      【解决方案3】:

      如果您将对象与父实体相关联,只需删除父实体即可。如果您的父母删除规则设置为“级联”,那么所有这些 (1k) 孩子也将被删除。

      约翰

      【讨论】:

      • 我刚遇到这个并打算使用这种方法,但请注意级联规则适用于实体关系。父/子状态用于创建实体子类型。
      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多