我使用Encrypted CoreData Sqlite Store来加密我的CoreData堆栈。我在数据库中有一个表,存储了超过400k的记录。我想根据某些活动删除大部分记录。由于批量删除不适用于此加密存储,我需要执行的是执行获取请求以读取数据。
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分钟以上。我相信核心数据足够快以提供故障对象,它不应该花费这么多时间,因为你可以看到我的谓词,我没有采取任何属性值,以减少获取时间。
有人可以帮我理解删除对象需要花费多长时间吗?
答案 0 :(得分:0)
花了这么长时间才能一次删除400k个对象。这不是关于加密,或者至少不是关于加密。这种操作一直很慢,并且是添加批量删除的原因。
在没有批处理的情况下删除这么多记录从根本上说是一个非常缓慢的过程。如果您不能使用批量删除,您需要认真考虑为什么需要删除这么多对象以及是否可以避免这种情况。如果要将它们全部删除,也许不要创建这么多。或者也许不要删除它们 - 因为如果你创建它们一次,也许你以后再创建它们?或者,如果它是用户帐户数据的脱机缓存,则可能无法获取所有数据。或者可以通过删除持久存储文件而不是逐个删除对象来处理删除。