2017-09-05 41 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秒仍然是一個荒謬的很長一段時間。我堅持我的分析。加密可能會讓它變得更糟,但它已經非常可怕,它並不重要。 –