2014-02-19 34 views
1

核心數據DB在我的應用我店以這種方式從JSON文件中的數據(它是一種身份的一個例子)的iOS:更新從JSON

NSManagedObjectContext *context = [self managedObjectContext]; 

for (id element in array){ 

    NSLog(@"element:%@", element); 

Str *str = [NSEntityDescription insertNewObjectForEntityForName:@"Str" inManagedObjectContext:context]; 
Id_loc *loc = [NSEntityDescription insertNewObjectForEntityForName:@"Id_loc" inManagedObjectContext:context]; 
loc.id_loc = @"id_1"; 
[str addLocObject:loc]; 
} 

的問題是,我解析此JSON每從網絡服務的一天;所以它每天都可以改變其「Str」身份(我的JSON的一個對象)的數據和數量。 問題是,有什麼更好的解決方案來更新我的核心數據庫? 我有兩種可能性:

1-更新我的DB與NSFetchRequest,檢查是否存在一個元素,並更新它;如果它不存在,我應該創建它。最後,如果一個對象不在JSON中,但它在我的核心數據庫中,我應該刪除它,這是一系列複雜的控件。

2-刪除所有核心數據數據庫,並用新的JSON文件重新填充。

在您看來,更好的選擇是什麼?

我說你在我的應用我只能看我的數據庫,我也不需要刪除或修改它,當我使用它。

回答

1

對於我的應用程序 - 在我使用CoreData以及 - 我決定去與選項1,有以下幾個原因。

首先對所有它只是有點更多的代碼,但性能與做法好多了。如果你打算使用NSFetchedResultController,你應該使用更新選項。否則,它會監聽您的更改,並且會重新加載所有視圖,因爲您刪除了所有對象並對其進行了讀取。

最重要的是消除所有的對象是真的在CoreData昂貴的操作,因爲你必須首先獲取所有的對象,不是由一個刪除一個!這真的是個壞主意:) 對於數百個條目,如果您打算在後臺執行更新而不是在更新過程中阻止屏幕,那麼它確實會降低應用程序的性能。

作爲一個優化,我會建議保留在每個對象的服務器端時間戳,並只從移動端的最後更新時間 - 增量更新拉動更改。

+0

好的,謝謝你,因爲@Wain寫道,你更喜歡第一選擇,那麼我應該問你一些圖書館或教程鏈接,申請這個,你有任何資源? – CrazyDev

+0

對於CoreData本身,我認爲最好的是http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started。其他問題對於您的應用程序而言非常具體 - 取決於您希望如何實施更新。我會建議與父母孩子MOCs和後臺線程中運行它。它爲UI和主線程提供了非常簡單的更新邏輯。 –

1

選項1是一般都比較好,但顯然可以根據變化和批次管理是更加昂貴。選項2總是代價高昂,但不易出錯。選項2增加了與保存附加信息相關的限制(目前可能不是關注的問題)。

理想的情況下,要充分利用現有的解決方案,提供的選項1的實現該測試,並提供性能/內存效率的選擇。類似RestKit(它可以使用臨時內存中緩存在映射過程中查找重複項)。作爲一個好處,你也可以簡化你可能擁有的其他映射代碼。