2017-09-05 39 views
0

我使用Encrypted CoreData Sqlite Store来加密我的CoreData堆栈。我有一个存储超过400k条记录的数据库表。我想根据某些活动删除大部分记录。由于批量删除不适用于此加密存储,因此我需要执行读取请求以读取数据。加密核心数据花费很多时间删除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

Hello Kapil 批量删除选项是最好的,因为迭代整个数据和删除将花费你大量的时间。尝试此链接https://stackoverflow.com/questions/23201917/ios-core-data-encryption#answer-23203728为您的数据的加密/安全性,并尝试批量删除 –

回答

0

需要这么长时间的是,您一次只删除400k个对象。这不是关于加密,或者至少不是主要关于这一点。这种操作一直很慢,并且是批量删除被添加的原因。

删除这些没有批处理的记录基本上是一个非常缓慢的过程。如果你不能使用批量删除,你需要认真考虑为什么你需要删除这么多的对象,以及你是否可以避免这种情况。如果你要删除所有的东西,也许不要创建这么多。或者不要删除它们 - 因为如果你创建了它们一次,也许你以后再创建它们?或者,如果它是用户帐户数据的脱机缓存,则可能不会获取所有数据。或者,也可以通过删除持久性存储文件而不是逐个删除对象来处理删除。

+0

相同的过程大约需要150秒的CoreData,并没有提高内存警告,并在加密存储中花费超过5分钟,并引发内存警告并崩溃。所以我猜这个加密商店出了点问题。 –

+0

150秒仍然是一个荒谬的很长一段时间。我坚持我的分析。加密可能会让它变得更糟,但它已经非常可怕,它并不重要。 –