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

Bry*_*oso 9 iphone core-data iphone-sdk-3.0

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

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

我看了一些 例如让JSON和CoreData进行交互的例子,但似乎他们只描述了将NSManagedObjects转换为JSON.如果我可以将JSON转换为CoreData,那么我唯一的问题就是能够在API中的数据发生变化时更改该数据.

(或者,也许这只是愚蠢的.)

Jaa*_*nus 15

对于某些概念性阅读,您可能希望阅读有关有效导入数据的文档,尤其是"查找或创建".查看以前的类似问题.

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

  1. 将JSON转换为本机Cocoa数据类型(NSDictionary和NSArray)
  2. 将NS*转换为Core Data对象

用于在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
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

以上假设您的JSON和Core Data模型中的属性名称相同且数据类型匹配(即JSON编号是Core Data NSNumbers等).即使模型发生变化,上面的代码也可以很好地工作.

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