我的应用程序上的所有数据都是通过JSON通过API提取的。这些数据中很大一部分的性质是它不会经常变化。因此,要制作JSON请求以获取不会发生太大变化的数据列表似乎并不那么吸引人。
我正在寻找最明智的选择,让这个JSON在某种持久性数据存储中保存到iPhone上。显然,当手机无法访问API时,保留数据的一个优点是提供它。
例如,我已经看过让JSON和CoreData交互的a few examples,但似乎它们只描述了将NSManagedObjects转换为JSON。如果我可以将JSON转换为CoreData,那么我唯一的问题就是当来自API的数据发生变化时能够更改该数据。
(或者,这可能只是愚蠢。)
答案 0 :(得分:15)
对于某些概念性阅读,您可能希望阅读有关Efficiently Importing Data的文档,尤其是“查找或创建”。 See a previous similar question.
获取JSON并将其作为核心数据保存在本地是非常合理的。我是如何做到的分为两个阶段:
用于在JSON和NS *之间进行转换的两个好框架是json-framework和TouchJSON。以下示例基于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子类化并使用生成的属性和访问器也是很好的。