- (void)tranformJSONItems:(NSArray *)jsonItems inCoreDataItem:(Item *)item {
/* Get the managed object context */
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
[jsonItems enumerateObjectsUsingBlock:^(NSDictionary *jsonItem, NSUInteger idx, BOOL *stop) {
Item *newItem = (Item *)[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Item class]) inManagedObjectContext:managedObjectContext];
newItem.label = jsonItem[@"label"];
newItem.itemID = [self.numberFormatter numberFromString:jsonItem[@"id"]];
if (nil!=item) {
[item addSubItemsObject:newItem];
}
NSArray *subitems = jsonItem[@"items"];
if (nil!=subitems) {
[self tranformJSONItems:subitems inCoreDataItem:newItem];
}
}];
if (nil==item)
[self saveChanges];
}
我想创建一个解析JSON并将其转换为Core Data的应用程序,但我拥有的JSON非常奇怪和困难(它的嵌套和递归)。
在我的JSON中,我有NSDictionary
个结果,其中包含许多项目数组。每个'校长' item有一个标签,一个ID和另一个Item(这是一个子项)。
当我使用这个递归函数时,我的问题是我的递归函数是无限的:
所有我的主要项目都有一个像(100,200,...)的ID所以我在我的谓词中使用了模数100作为主要项目。我的子项目都有一个与其主要项目相对应的ID。例如,对于100,你有子目标,其ID为101 102 ..我使用max和min谓词为我的idToLoad(我使用NSRange
),我的{{I} {1}},以及NSminPredicate
谓词的NSMaxRange
。
答案 0 :(得分:0)
不要总是插入新项目,而是为特定itemID
实现查找或创建模式。
写一个获取请求,返回具有特定Item
的所有itemID
个实例(希望这只是一个数组)。然后,如果你坚持的话,在Item
(或NSManagedObject
上)写一个类方法,但如果你继承NSManagedObject
,你的代码会更容易编写/读取。该类方法将NSManagedObjectContext
和itemID
作为参数,调用您的获取请求,并返回匹配的Item
实例。这就是“发现或创造”中的“发现”部分。
现在,编写另一个类方法,接受与上面的“find”方法相同的参数。此方法执行提取。如果找到匹配项,则返回该实例。如果找不到匹配项,则插入新的Entity
,使用itemID
对其进行初始化,然后返回。这是“查找或创建”:它始终返回具有正确itemID
的实例,除非需要,否则永远不会创建新实例。