JSON到持久数据存储(CoreData等)

时间:2010-04-01 22:03:36

标签: iphone iphone-sdk-3.0 core-data

我的应用程序上的所有数据都是通过JSON通过API提取的。这些数据中很大一部分的性质是它不会经常变化。因此,要制作JSON请求以获取不会发生太大变化的数据列表似乎并不那么吸引人。

我正在寻找最明智的选择,让这个JSON在某种持久性数据存储中保存到iPhone上。显然,当手机无法访问API时,保留数据的一个优点是提供它。

例如,我已经看过让JSON和CoreData交互的a few examples,但似乎它们只描述了将NSManagedObjects转换为JSON。如果我可以将JSON转换为CoreData,那么我唯一的问题就是当来自API的数据发生变化时能够更改该数据。

(或者,这可能只是愚蠢。)

2 个答案:

答案 0 :(得分:15)

对于某些概念性阅读,您可能希望阅读有关Efficiently Importing Data的文档,尤其是“查找或创建”。 See a previous similar question.

获取JSON并将其作为核心数据保存在本地是非常合理的。我是如何做到的分为两个阶段:

  1. 将JSON转换为本机Cocoa数据类型(NSDictionary和NSArray)
  2. 将NS *转换为核心数据对象
  3. 用于在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和Core Data模型中的属性名称相同且数据类型匹配(即JSON编号是Core Data NSNumbers等)。即使模型发生变化,上面的代码也能很好地工作。

    上面的代码没有考虑如何测试对象是否已经存在于本地,但你可以想象如何添加它。您必须在模型中具有某种形式的对象ID,并且可以在添加对象之前查看对象是否存在于本地,或者是否需要更新现有对象。

答案 1 :(得分:1)

  • 当存在多对关系时,可能需要访问者。
  • 使用访问器比使用键值更有效。 (无论如何,内部核心数据可能会使用键值,因此如果是这种情况,这一点可能不正确。)
  • 使用子类和属性,编译器可以帮助您检测问题,而在使用键值时,问题只会在运行时显示并且难以修复。

因此,将NSManagedObject子类化并使用生成的属性和访问器也是很好的。