【问题标题】:JSON to Persistent Data Store (CoreData, etc.)JSON 到持久数据存储(CoreData 等)
【发布时间】:2011-02-03 13:45:26
【问题描述】:

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

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

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

(或者,也许这一切都是愚蠢的。)

【问题讨论】:

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


    【解决方案1】:
    • 当存在一对多关系时,可能需要访问器。
    • 使用访问器比使用键值更有效。 (无论如何,Core Data 内部都可能使用键值对,所以如果是这种情况,这一点可能不正确。)
    • 使用子类和属性,编译器可以帮助您检测问题,而使用键值,问题只会在运行时显示,更难修复。

    因此,继承 NSManagedObject 并使用生成的属性和访问器也是很好的。

    【讨论】:

      【解决方案2】:

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

      获取 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
      }
      

      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,并且您可以在添加之前查看该对象是否在本地存在,或者是否需要更新现有对象。

      【讨论】:

        猜你喜欢
        • 2011-01-17
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多