2017-09-15 20 views
2

我的應用程序中存在這個問題,即從我的數據庫中刪除大量數據需要很長時間。所以我開始調試,發現變壓器是問題所在!瞭解CoreData中變形的錯誤

要看到我創建的隔離問題的一個項目...

的問題,我有以下幾點:

+-----------+  +-----------+ 
| Entity A |  | Entity B | 
+-----------+  +-----------+ 
|   |  | property | 
| b   | 1:1 | a   | 
+-----------+  +-----------+ 

所以Entity A有一個1:1的關係Entity B。並且Entitiy B有一個名爲property的屬性,它是Transformable並具有ValueTransformer。 A到B的刪除規則無效。

現在我創建一個A和B的實例,將它們鏈接起來並寫入屬性。保存上下文,一切按預期工作。

現在我想刪除Entity A的所有對象。我創建一個提取請求,並刪除所有實體。在我的示例我這樣做,像這樣:

context.perform { 
    let fetchRequest = NSFetchRequest<EntityA>(entityName: "EntityA") 
    guard let allEntities = try? context.fetch(fetchRequest) else { return } 

    for entity in allEntities { 
     context.delete(entity) 
    } 
    try? context.save() 
} 

現在時保存情況,值變壓器reverseTransformedValue被調用。我不明白爲什麼?!?因爲我不訪問該屬性...我沒有設置或得到它...

如果有人能爲我擺脫一些光,會很酷。

我也有可以在這裏找到我的樣本項目:https://www.dropbox.com/s/651dmyughosr90p/ValueTransformerIssue-Sample.zip?dl=0

回答

2

這是一個有趣和有些出人意料的結果,但我認爲這是核心數據運行正常。關於核心數據的一些背景細節:

  • 當讀取對象時,通常是「故障」。除非您將提取請求配置爲需要加載,否則屬性值不會立即加載。
  • 當故障對象「發生火災」時,全部屬性值被加載。這會在您訪問任何屬性值時自動發生,因此如果查找一個屬性,則會加載所有屬性值。
  • 爲了更改屬性上的值,Core Data將加載屬性值。

你的情況,這似乎要發生的事情是:

  • 你取的EntityA實例。
  • 您可以刪除這些實例。
  • 由於您使用「無效」作爲刪除規則,因此刪除EntityA意味着核心數據需要修改相應的EntityB,方法是將其值設置爲a爲零。
  • 內部核心數據需要加載EntityB實例。由於它正在修改其中一個屬性,它首先加載所有屬性。此時您的值轉換器即使在這裏並不真正需要。

如果你的價值變壓器損害性能,有些東西你可以嘗試修復包括:

  • 移動這個屬性到的相關人士EntityB一個獨立的實體。當屬性錯誤發生時,關係錯誤不會觸發,所以無效規則不會載入這個新實體的實例。
  • 儘管NSBatchDeleteRequest不符合刪除規則(因此「不應用」「無效」),但您可能可以將其與NSBatchUpdateRequest合併以修復關係。類似的,對EntityA實例進行批量刪除,然後進行批量更新,以將關係設置爲無影響的EntityB實例。

或者當然,也許你的價值變壓器可以優化,使它不是一個問題?

希望這會有所幫助。祝你好運!

+0

你好,湯姆,很高興再次讀你:) 我想你是對的,那關係的問題就是問題。 在我的真實應用程序(這裏不只是這個示例),我已經有一個單獨的實體,其中包含價值可轉換數據。只是數據而沒有別的,因爲錯誤加載了一切。另一個問題是這些數據很大。它是您記錄的活動的GPS數據。 我想最好的解決方案是將它們寫入一個文件,並且只是從核心數據中引用它們,我猜?!? 我也看了一下'NSBatchUpdateRequest',但是因爲我有...... – Georg

+0

......相當一些關係太過痛苦才能得到正確的......我想我只需要找到一種更好的方式來存儲我的數據,因爲在SQL中有這麼多的二進制文件不是一個好主意...... 我會等待更多的接受你的答案,以防萬一奇蹟發生,有人有一個超級簡單的解決方案......但非常感謝你很多爲您的詳細答案! – Georg

+0

@Tom我認爲NSBatchDeleteRequest確實遵守刪除規則 - 只是不自定義驗證? – pbasdf