2016-08-17 117 views
1

我有一個核心數據應用程序,其中包含由多個實體組成的單個模型。爲了這個問題的目的,讓我們調用模型「Person」並且擁有「name」(字符串),「age」(int),「職業」(字符串)和「description」(字符串)的實體。核心數據 - 重新啓動應用程序時部分數據丟失

作爲一個例子,我可以添加一個新的Person。我設定了他們的名字,年齡,職業和描述。我通過檢查NSManagedObjectContextObjectsDidChangeNotification userInfo的內容確認上下文已更新。然後將上下文保存並保存到磁盤(通過日誌記錄和查詢SQLite數據庫進行確認)。

此時,我可以編輯我的任何Person對象,並且可以修改,添加,刪除等所有實體,並且確認所有更改都通過NSManagedObjectContextObjectsDidChangeNotification更改上下文並且通過日誌記錄被確認保存到磁盤並查詢SQLite - 一切都按預期工作。

但是,「職業」和「描述」在重新啓動應用後不會持續。它們沒有被設置爲transient(但是它們是「可選的」),並且在設置主要上下文後(有時多次)。更重要的是,如果我退出應用程序,再次打開應用程序,我可以查詢SQLite數據庫並確認更改仍然存在於磁盤上。

當應用程序重新打開時,我可以確認磁盤上的所有內容與我退出時的相同。 但是,當我在我的應用代理中初始化核心數據時,NSManagedObjectContextObjectsDidChangeNotification通知我有些變化。出於某種原因,「職業」和「描述」已經消失。它們沒有被設置爲null,它們被設置爲零長度的字符串。因此,下次發生觸發保存的事件時,「職業」和「描述」被設置爲零長度的字符串並消失。這一切都發生在啓動 - 我不訪問視圖控制器或任何其他甚至查詢這些特定領域。然而,我確實展示了一個視圖控制器,它確實需要一個獲取請求來填充顯示People對象的UITableView,雖然它沒有明確顯示任何有問題的實體。

從Person 1到Person 2有一個輕量級的Core Data Model遷移,但是當切換回Person 1時,這個問題依然存在,這讓我相信這不是遷移問題。

我在詢問有關從哪裏開始解決此問題的建議。我無法發佈代碼 - 我不知道在我的應用程序中發生問題的位置。我試圖儘可能地進行故障排除,確認上下文中發生的更改以及與磁盤上的更改相比,我只是不知道該從哪裏下載。我不知道爲什麼這些實體(以及其中一些實體)正在消失。有人會如何開始解決這類問題?任何幫助表示讚賞。

+0

在您的「人員管理對象模型」中,爲有問題的屬性創建自定義設置器並添加斷點。如果這些實際上在應用程序重新啓動時被修改,您應該會看到通過這些方法發生的情況,堆棧跟蹤會爲您提供有關誰正在調用它的提示。 – Rog

+1

如果將屬性重命名爲不同的東西,又會發生什麼?試試'occup1'和'description1',看看問題是否存在,然後從那裏開始。我敢肯定,你不應該使用'description'作爲屬性名稱,因爲它覆蓋了'NSObject'實現的'description'。 Yup看到這裏的文檔說你不願意重寫'description',因爲結果可能是不可預知的https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/LifeofaManagedObject.html# // apple_ref/doc/uid/TP40001075-CH16-SW1 – Rog

+0

在有問題的實體中,重寫'validateValue:forKey:error',並添加條件代碼,當'value'爲空字符串且'key'爲麻煩的領域。現在,在日誌記錄行上放置一個斷點,通過回溯,您可以看到究竟是誰將字段設置爲空字符串。 – Avi

回答

0

感謝@Rog和@Avi的指導,我能夠爲有問題的屬性設置自定義設置器並覆蓋validateValue:forKey:error,並在每個設置斷點。從這裏,我能夠看到調用方法並正確診斷問題。

實際的問題是,當我初始化核心數據時,我誤解了每個對象都要調用initWithEntity:insertIntoManagedObjectContext:,在這種印象中,只有在最初創建對象(一次且僅一次)時纔會調用它。有問題的代碼在initWithEntity:insertIntoManagedObjectContext:

謝謝你的幫助!

相關問題