我正在使用Core Data在本地持久保存Web服务调用的结果 . Web服务返回完整的对象模型,比方说,“汽车” - 可能是大约2000个(我不能让Web服务返回任何小于1或所有汽车 .
下次打开我的应用程序时,我想通过再次为所有汽车调用Web服务来刷新Core Data持久化副本,但为了防止重复,我需要首先清除本地缓存中的所有数据 .
是否有更快的方法来清除托管对象上下文中特定实体的所有实例(例如“CAR”类型的所有实体),或者我是否需要查询它们,然后遍历结果以删除每个,然后保存?
理想情况下,我可以说删除所有实体是Blah的地方 .
22 回答
iOS 9及更高版本:
iOS 9添加了一个名为
NSBatchDeleteRequest
的新类,它允许您轻松删除与谓词匹配的对象,而无需将它们全部加载到内存中 . 这里's how you' d使用它:斯威夫特2
Objective-C
有关批删除的更多信息,请参见"What's New in Core Data" session from WWDC 2015(从~14:10开始) .
iOS 8及更早版本:
获取所有并删除所有:
更清洁和通用:添加此方法:
重置 Swift 3 中的实体:
For Swift 2.0:
Swift:
这是与here类似的问题,有人建议设置关系删除规则,因此您只需要删除一个对象 . 因此,如果您拥有或可以创建与汽车具有多对多关系的实体,并在删除较高实体时将删除规则设置为级联,则所有汽车也将被删除 . 这可以节省一些处理时间,因为您不必执行加载所有汽车所涉及的步骤 . 在更大的数据集中,这可能是绝对必要的 .
已经发布了一个很好的答案,这只是一个建议!
一个好方法是只添加一个类别到
NSManagedObject
并实现像我一样的方法:头文件(例如
NSManagedObject+Ext.h
)代码文件:(例如NSManagedObject Ext.m)
...你唯一需要的是从app委托中获取managedObjectContext,或者你拥有它的每一个;)
之后你可以像以下一样使用它:
进一步优化可能是您删除了实体名称的参数,而是从clazzname中获取名称 . 这将导致使用:
一个更干净的impl(作为NSManagedObjectContext的类别):
用法然后:
延伸Dave Delong的答案 .
Swift版本也可以处理iOS 9和以前的版本 . 我还介绍了错误处理:
让appDelegate:AppDelegate = UIApplication.sharedApplication() . 委托为! AppDelegate中
iOS 10 and later
适用于所有版本 . 传递实体名称并迭代以删除所有条目并保存上下文 .
Swift 3.X 和 Swift 4.X ,简单的方法 . 仅更改 YourTable
为什么不折叠使用现有缓存接收的数据?否则它不是真正的'刷新',它'重新开始'你也可以删除/删除SQLLite文件并重新开始(假设你也没有持久保存其他数据) .
Swift 4, iOS 12 and Xcode 10 Update
100% working just cut & paste
把这个功能放在相关的课堂上
并在
viewDidLoad()
中调用此函数self.deleteData()
或者在任何地方或在功能或按钮下,以便通过单击按钮删除实体中的所有数据,并将"myEntity"替换为您在核心数据中定义的实体
如果实体包含很多条目,那么最好的方法就是这样,因为它可以节省内存
In Swift 3.0
In Swift 2.0:
此代码适用于iOS 9及更低版本
Dave Delongs的Swift 2.0答案让我崩溃(在iOS 9中)
但这有效:
带有iOS 9 'NSBatchDeleteRequest'的Swift 3解决方案以及作为'NSManagedObjectContext'上的扩展实现的早期iOS版本的回退 . Apple参考https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
使用NSBatchDeleteRequest删除多条记录如果Minimum iOS为9.0 . 如果是后台线程,则执行NSManagedObjectContext save else使用NSFetchRequest来获取记录并删除for循环中的所有记录并保存一次删除完成 .
Swift 4, iOS 10+
静态函数,可以应用于任何实体删除其所有数据
'房间'是一个实体
在iOS 11.3和Swift 4.1中
执行后你必须调用reset . 如果没有,它将不会在表视图上更新 .
iOS 9.0 and Later :
NSBatchDeleteRequest
用于删除核心数据中的记录 . 它工作得非常快,从实体中删除所有记录所需的时间更少 . 它在论证中需要NSFetchRequest
. 如果要删除实体中的所有记录,你可以使用它,它适用于我 .