我正在使用Encrypted CoreData Sqlite Store来加密我的CoreData堆栈。我在数据库中有一个表,其中存储了超过40万条记录。我想删除基于某些活动的大部分记录。由于批量删除对于这个加密存储不可用,所以我需要做的是,执行一个读取数据的获取请求。
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity")
fetchRequest.includesPropertyValues = false
// Fetch data till minimum threshold limit
let newPredicate = NSPredicate(format: "%K <= %@", "recordTime", NSNumber(value: maxAllowedTimeStamp as Int64))
fetchRequest.predicate = newPredicate
let objectsToDelete = myDataController.executeFetchRequest(fetchRequest) as? [NSManagedObject]然后我逐个执行删除操作对象:
for object in objectsToDelete {
myDataController.deleteManagedObject(object)
}此操作耗时超过7-8分钟。我相信核心数据足够快来提供错误对象,它不应该花费这么多时间,因为您可以看到我的谓词中,我没有采用任何属性值来减少获取时间。
有没有人能帮我解释一下删除对象花了这么长时间的原因?
发布于 2017-09-05 23:00:51
耗时如此之长的是,您一次删除了40万个对象。它不是关于加密的,或者至少不是主要关于加密的。这种操作总是很慢,这也是添加批量删除的原因。
在不进行批处理的情况下删除这么多记录从根本上来说是一个非常慢的过程。如果你不能使用批量删除,你需要认真考虑为什么你需要删除这么多的对象,以及你是否可以避免这种情况。如果你打算把它们全部删除,也许不要创建这么多。或者可能不要删除它们--因为如果您只创建了一次,以后可能会再次创建它们?或者,如果它是用户帐户数据的离线缓存,可能不会获取所有这些数据。或者可以通过移除持久存储文件而不是逐个删除对象来处理删除。
https://stackoverflow.com/questions/46051088
复制相似问题