2010-04-01 85 views
9

我的應用程序中的所有數據都通過JSON通過API進行傳輸。這些數據中很大一部分的性質是它並不經常改變。因此,如果要發佈JSON請求來獲取不會有太大變化的數據列表,這些列表看起來並不吸引人。將JSON傳遞到持久性數據存儲(CoreData等)

我正在尋找最明智的選擇,將這個JSON保存到iPhone的某種持久性數據存儲中。顯然,堅持數據的一個方面就是在手機無法訪問API時提供數據。例如,我看過a fewexamples有JSON和CoreData交互,但它們似乎只描述將NSManagedObjects轉換爲JSON。如果我可以將JSON轉換爲CoreData,我唯一的問題就是能夠在API的數據發生變化時更改該數據。

(或者,也許這一切只是愚蠢的。)

回答

15

對於一些概念上的閱讀,您可能需要閱讀文件關於Efficiently Importing Data,尤其是「查找,或創建」。 See a previous similar question.

獲取JSON並將其保存爲本地Core Data是非常合理的。它是如何我做的是在兩個階段:

  1. 轉換JSON天然可可數據類型(的NSDictionary和NSArray的)
  2. 轉換NS *爲核心數據對象

兩個很好的框架,以JSON之間的轉換和NS *是json-frameworkTouchJSON。以下示例基於json-framework。

假設您從JSON獲取一些對象的數組。然後,您會怎麼做:

NSArray *objects = [jsonStringYouGotFromServer JSONValue]; 
for (NSDictionary *_object in objects) { 
    CDObjectType *cdObject = [self cdObjectFromDictionary:_object]; 
    // cdObject is now a full-featured Core Data object 
} 

的cdObjectFromDictionary可能是這樣的:

- (CDObjectType *) cdObjectFromDictionary:(NSDictionary *)dict { 

    CDObjectType *object = [NSEntityDescription 
       insertNewObjectForEntityForName:@"Object" 
       inManagedObjectContext:moc]; 

    NSDictionary *attributes = [[NSEntityDescription 
     entityForName:@"Object" 
     inManagedObjectContext:moc] attributesByName]; 

    for (NSString *attr in attributes) {    
     [object setValue:[dict valueForKey:attr] forKey:attr];        
    } 

    return object; 
} 

以上假設,在你的JSON和核心數據模型的屬性名相同,並且該數據類型匹配(即JSON數字是核心數據NSNumbers等)。即使模型改變,上面的代碼也能很好地工作。

上述代碼不考慮如何測試對象是否已經存在於本地,但您可以想象如何添加該對象。您的模型中必須具有某種形式的對象ID,並且您可以在添加它之前查看該對象是否存在於本地,或者是否需要更新現有對象。

1
  • 當存在多對多關係時可能需要訪問器。
  • 使用訪問器比使用鍵值更有效。 (無論如何,內部核心數據可能會使用鍵值,所以如果是這種情況,這一點可能不是真實的。)
  • 使用子類和屬性,編譯器可以幫助您檢測問題,同時使用鍵值,問題只會在運行時顯示,難以修復。

因此,NSManagedObject的子類並使用生成的屬性和訪問器也是很好的。