2010-04-01 51 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的子类并使用生成的属性和访问器也是很好的。