猿问
下载APP

iPhone上的JSON和核心数据

iPhone上的JSON和核心数据

我有一个核心数据对象图(由两个由多对多关系链接的实体组成)。

我很好奇,作为一个相对缺乏经验的iPhone开发人员,是否有人可以推荐一种方法,以及适合iPhone的JSON实现,这将允许我:

  1. 将核心数据记录转换为JSON字符串(同时保持实体之间的关系); 和

  2. 将JSON字符串转换回核心数据对象(再次保留实体之间的关系)。

我已经在这一点上搜索了一个教程/代码示例,但没有成功,所以我将非常感激地收到任何帮助。


森栏
浏览 41回答 3
3回答

桃花长相依

首先,选择一个JSON库来使用,我个人喜欢TouchJSON,但其他几个也很不错。复杂的部分虽然不是很难,但是要将您的托管对象转换为适合转换的结构。我写得这么快,所以它可能有一两个错误:)你调用的方法是:- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects; - (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc;实施如下:- (NSDictionary*)dataStructureFromManagedObject:(NSManagedObject*)managedObject{   NSDictionary *attributesByName = [[managedObject entity] attributesByName];   NSDictionary *relationshipsByName = [[managedObject entity] relationshipsByName];   NSMutableDictionary *valuesDictionary = [[managedObject dictionaryWithValuesForKeys:[attributesByName allKeys]] mutableCopy];   [valuesDictionary setObject:[[managedObject entity] name] forKey:@"ManagedObjectName"];   for (NSString *relationshipName in [relationshipsByName allKeys]) {     NSRelationshipDescription *description = [[[managedObject entity] relationshipsByName] objectForKey:relationshipName];     if (![description isToMany]) {       NSManagedObject *relationshipObject = [managedObject valueForKey:relationshipName];       [valuesDictionary setObject:[self dataStructureForManagedObject:relationshipObject] forKey:relationshipName];       continue;     }     NSSet *relationshipObjects = [managedObject objectForKey:relationshipName];     NSMutableArray *relationshipArray = [[NSMutableArray alloc] init];     for (NSManagedObject *relationshipObject in relationshipObjects) {       [relationshipArray addObject:[self dataStructureForManagedObject:relationshipObject]];     }     [valuesDictionary setObject:relationshipArray forKey:relationshipName];   }   return [valuesDictionary autorelease];}- (NSArray*)dataStructuresFromManagedObjects:(NSArray*)managedObjects{   NSMutableArray *dataArray = [[NSMutableArray alloc] init];   for (NSManagedObject *managedObject in managedObjects) {     [dataArray addObject:[self dataStructureForManagedObject:managedObject]];   }   return [dataArray autorelease];}- (NSString*)jsonStructureFromManagedObjects:(NSArray*)managedObjects{   NSArray *objectsArray = [self dataStructuresFromManagedObjects:managedObjects];   NSString *jsonString = [[CJSONSerializer serializer] serializeArray:objectsArray];   return jsonString;}- (NSManagedObject*)managedObjectFromStructure:(NSDictionary*)structureDictionary withManagedObjectContext:(NSManagedObjectContext*)moc{   NSString *objectName = [structureDictionary objectForKey:@"ManagedObjectName"];   NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:objectName inManagedObjectContext:moc];   [managedObject setValuesForKeysWithDictionary:structureDictionary];   for (NSString *relationshipName in [[[managedObject entity] relationshipsByName] allKeys]) {     NSRelationshipDescription *description = [relationshipsByName objectForKey:relationshipName];     if (![description isToMany]) {       NSDictionary *childStructureDictionary = [structureDictionary objectForKey:relationshipName];       NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];       [managedObject setObject:childObject forKey:relationshipName];       continue;     }     NSMutableSet *relationshipSet = [managedObject mutableSetForKey:relationshipName];     NSArray *relationshipArray = [structureDictionary objectForKey:relationshipName];     for (NSDictionary *childStructureDictionary in relationshipArray) {       NSManagedObject *childObject = [self managedObjectFromStructure:childStructureDictionary withManagedObjectContext:moc];       [relationshipSet addObject:childObject];     }   }   return managedObject;}- (NSArray*)managedObjectsFromJSONStructure:(NSString*)json withManagedObjectContext:(NSManagedObjectContext*)moc{   NSError *error = nil;   NSArray *structureArray = [[CJSONDeserializer deserializer] deserializeAsArray:json error:&error];   NSAssert2(error == nil, @"Failed to deserialize\n%@\n%@", [error localizedDescription], json);   NSMutableArray *objectArray = [[NSMutableArray alloc] init];   for (NSDictionary *structureDictionary in structureArray) {     [objectArray addObject:[self managedObjectFromStructure:structureDictionary withManagedObjectContext:moc]];   }   return [objectArray autorelease];}现在这是递归的,所以如果你不小心的话,你可以轻松地翻译整个持久性商店。观察您的关系并确保它们仅“关闭”对象树,以便您只获得要翻译的对象。

米脂

如果您NSDate的托管对象中有一个,如上面其中一条评论所述,那么序列化包含该对象的对象时会遇到问题NSDate。一个简单的解决JSONDataRepresentation方法是添加一个NSDate使用objective-c类别的方法。将这两个文件添加到项目中:NSdate.h:#import&nbsp;<Foundation/Foundation.h>@interface&nbsp;NSDate&nbsp;(jsondatarepresentation)&nbsp;-&nbsp;(NSData*)&nbsp;JSONDataRepresentation;@endNSDate.m:#import&nbsp;"NSDate.h"@implementation&nbsp;NSDate&nbsp;(jsondatarepresentation)-&nbsp;(NSData*)&nbsp;JSONDataRepresentation&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[[[NSNumber&nbsp;numberWithDouble:[self&nbsp;timeIntervalSince1970]]&nbsp;stringValue]&nbsp;dataUsingEncoding:NSUTF8StringEncoding];}@end

www说

Marcus S. Zarra激励我将递归的想法带入工作版本。在此版本中,您无需在CoreData中设置密钥,您可以将其剪切并粘贴到项目中:-)//&nbsp;MARK:&nbsp;-&nbsp;encoding&nbsp;and&nbsp;decoding&nbsp;CoreData&nbsp;entity&nbsp;to&nbsp;dictionaryfunc&nbsp;dataStructureFromManagedObject(&nbsp;managedObject:NSManagedObject?,&nbsp;parentEntity:&nbsp;NSEntityDescription?&nbsp;=&nbsp;nil)&nbsp;->&nbsp;NSMutableDictionary&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(managedObject&nbsp;!=&nbsp;nil)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;attributesByName:&nbsp;NSDictionary&nbsp;=&nbsp;managedObject!.entity.attributesByName &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipsByName:&nbsp;NSDictionary&nbsp;&nbsp;=&nbsp;managedObject!.entity.relationshipsByName &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;valuesImmutableDictionary:&nbsp;NSDictionary&nbsp;=&nbsp;managedObject!.dictionaryWithValuesForKeys(&nbsp;attributesByName.allKeys) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;valuesDictionary:&nbsp;NSMutableDictionary&nbsp;=&nbsp;valuesImmutableDictionary.mutableCopy()&nbsp;as&nbsp;NSMutableDictionary &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valuesDictionary.setObject(&nbsp;managedObject!.entity.name!,&nbsp;forKey:&nbsp;"ManagedObjectName") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;relationshipNameObject&nbsp;in&nbsp;relationshipsByName.allKeys&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipName:&nbsp;NSString&nbsp;=&nbsp;relationshipNameObject&nbsp;as&nbsp;&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipDescription:&nbsp;NSRelationshipDescription?&nbsp;=&nbsp;relationshipsByName.objectForKey(&nbsp;relationshipName)&nbsp;as?&nbsp;NSRelationshipDescription &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!relationshipDescription!.toMany&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ono&nbsp;to&nbsp;one &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;parentEntity&nbsp;==&nbsp;nil&nbsp;||&nbsp;(relationshipDescription!&nbsp;as&nbsp;NSRelationshipDescription).destinationEntity&nbsp;!=&nbsp;parentEntity!&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;no&nbsp;parent&nbsp;or&nbsp;relationship&nbsp;is&nbsp;"downward"&nbsp;->&nbsp;object&nbsp;for&nbsp;relationship&nbsp;must&nbsp;be&nbsp;added &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipObject:&nbsp;NSManagedObject?&nbsp;=&nbsp;managedObject!.valueForKey(&nbsp;relationshipName)&nbsp;as?&nbsp;NSManagedObject &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipObjectDictionary:&nbsp;NSMutableDictionary&nbsp;=&nbsp;self.dataStructureFromManagedObject(&nbsp;relationshipObject,&nbsp;parentEntity:&nbsp;managedObject?.entity) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valuesDictionary.setObject(&nbsp;relationshipObjectDictionary,&nbsp;forKey:&nbsp;relationshipName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;relationship&nbsp;is&nbsp;"upward"&nbsp;->&nbsp;nothing&nbsp;to&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;one&nbsp;to&nbsp;many&nbsp;->&nbsp;all&nbsp;objects&nbsp;must&nbsp;be&nbsp;added &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipObjects:&nbsp;NSSet&nbsp;=&nbsp;managedObject!.mutableSetValueForKey(&nbsp;relationshipName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipArray:NSMutableArray&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;relationshipObjectRaw&nbsp;in&nbsp;relationshipObjects&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipObject:NSManagedObject?&nbsp;=&nbsp;relationshipObjectRaw&nbsp;as?&nbsp;NSManagedObject &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;relationshipObject&nbsp;!=&nbsp;nil&nbsp;&&&nbsp;!relationshipObject!.entity.isKindOfEntity(&nbsp;managedObject!.entity)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relationshipArray.addObject(self.dataStructureFromManagedObject(&nbsp;relationshipObject,&nbsp;parentEntity:&nbsp;managedObject?.entity)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valuesDictionary.setObject(&nbsp;relationshipArray,&nbsp;forKey:&nbsp;relationshipName) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;valuesDictionary&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NSMutableDictionary() &nbsp;&nbsp;&nbsp;&nbsp;}}func&nbsp;managedObjectFromStructure(&nbsp;structureDictionary:&nbsp;NSDictionary,&nbsp;moc:&nbsp;NSManagedObjectContext,&nbsp;parentObject:&nbsp;NSManagedObject?&nbsp;=&nbsp;nil)&nbsp;->&nbsp;NSManagedObject&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;structureDictionary.count&nbsp;>&nbsp;0&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;objectName:NSString&nbsp;=&nbsp;structureDictionary.objectForKey(&nbsp;"ManagedObjectName")&nbsp;as&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;managedObject:NSManagedObject&nbsp;=&nbsp;NSEntityDescription.insertNewObjectForEntityForName(&nbsp;objectName,&nbsp;inManagedObjectContext:&nbsp;moc)&nbsp;as&nbsp;NSManagedObject &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipsByName:&nbsp;NSDictionary&nbsp;&nbsp;=&nbsp;managedObject.entity.relationshipsByName &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;realObjectStructure:NSMutableDictionary&nbsp;=&nbsp;structureDictionary.mutableCopy()&nbsp;as&nbsp;NSMutableDictionary &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realObjectStructure.removeObjectForKey(&nbsp;"ManagedObjectName") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;key&nbsp;in&nbsp;realObjectStructure.allKeys&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;search&nbsp;for&nbsp;"ManagedObjectName"&nbsp;relationship&nbsp;entrys&nbsp;and&nbsp;delete&nbsp;them&nbsp;before&nbsp;filling&nbsp;the&nbsp;managedObject&nbsp;from&nbsp;this&nbsp;structure &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;relationshipName&nbsp;in&nbsp;relationshipsByName.allKeys&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;relationshipName&nbsp;as&nbsp;NSString&nbsp;==&nbsp;key&nbsp;as&nbsp;NSString&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realObjectStructure.removeObjectForKey(&nbsp;key) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;managedObject.setValuesForKeysWithDictionary(&nbsp;realObjectStructure) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;the&nbsp;main&nbsp;object&nbsp;with&nbsp;attributes&nbsp;is&nbsp;created.&nbsp;Now&nbsp;care&nbsp;about&nbsp;the&nbsp;relationships &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;relationshipName&nbsp;in&nbsp;managedObject.entity.relationshipsByName.keys&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;description:NSRelationshipDescription&nbsp;=&nbsp;relationshipsByName.objectForKey(&nbsp;relationshipName)&nbsp;as&nbsp;NSRelationshipDescription &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!description.toMany&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;one&nbsp;relationship &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;parentObject&nbsp;==&nbsp;nil&nbsp;||&nbsp;description.destinationEntity&nbsp;!=&nbsp;parentObject!.entity&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;no&nbsp;parent&nbsp;or&nbsp;relationship&nbsp;is&nbsp;"downward"&nbsp;->&nbsp;recurse&nbsp;structure&nbsp;to&nbsp;add &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;childStructureDictionary:NSDictionary&nbsp;=&nbsp;structureDictionary.objectForKey(&nbsp;relationshipName)&nbsp;as&nbsp;NSDictionary &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;childStructureDictionary.count&nbsp;>&nbsp;0&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dictionary&nbsp;not&nbsp;empty&nbsp;->&nbsp;object&nbsp;must&nbsp;be&nbsp;created&nbsp;and&nbsp;added &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;childObject:NSManagedObject?&nbsp;=&nbsp;self.managedObjectFromStructure(&nbsp;childStructureDictionary,&nbsp;moc:&nbsp;moc,&nbsp;parentObject:&nbsp;managedObject) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;validateForUpdate &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;error:NSError? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!managedObject.validateForUpdate(&nbsp;&error)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Error:&nbsp;Object&nbsp;not&nbsp;in&nbsp;valid&nbsp;state&nbsp;for&nbsp;update!!!&nbsp;->&nbsp;\(error)") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;managedObject.setValue(&nbsp;childObject,&nbsp;forKey:&nbsp;relationshipName&nbsp;as&nbsp;NSString) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;relationship&nbsp;is&nbsp;"upward"&nbsp;->&nbsp;nothing&nbsp;to&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;many&nbsp;relationship &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipSet:NSMutableSet&nbsp;=&nbsp;managedObject.mutableSetValueForKey(&nbsp;relationshipName&nbsp;as&nbsp;NSString) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;relationshipArray:NSArray&nbsp;=&nbsp;structureDictionary.objectForKey(&nbsp;relationshipName&nbsp;as&nbsp;NSString)&nbsp;as&nbsp;NSArray &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;childStructureDictionary&nbsp;in&nbsp;relationshipArray&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;childStructureDictionary.count&nbsp;>&nbsp;0&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;dictionary&nbsp;not&nbsp;empty&nbsp;->&nbsp;object&nbsp;must&nbsp;be&nbsp;created&nbsp;and&nbsp;added &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;childObject:NSManagedObject&nbsp;=&nbsp;self.managedObjectFromStructure(&nbsp;childStructureDictionary&nbsp;as&nbsp;NSDictionary,&nbsp;moc:&nbsp;moc,&nbsp;parentObject:&nbsp;managedObject) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;validateForUpdate &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;error:NSError? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!managedObject.validateForUpdate(&nbsp;&error)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;"Error:&nbsp;Object&nbsp;not&nbsp;in&nbsp;valid&nbsp;state&nbsp;for&nbsp;update!!!&nbsp;->&nbsp;\(error)") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relationshipSet.addObject(&nbsp;childObject) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;no&nbsp;object&nbsp;was&nbsp;behind&nbsp;the&nbsp;relationship&nbsp;->&nbsp;nothing&nbsp;to&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;save&nbsp;set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;managedObject.setValue(&nbsp;relationshipSet,&nbsp;forKey:&nbsp;relationshipName&nbsp;as&nbsp;NSString) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;final&nbsp;check&nbsp;validateForUpdate &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;error:NSError? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;!managedObject.validateForUpdate(&nbsp;&error)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;"Error:&nbsp;Object&nbsp;not&nbsp;in&nbsp;valid&nbsp;state&nbsp;for&nbsp;update&nbsp;although&nbsp;all&nbsp;previous&nbsp;check&nbsp;are&nbsp;passed!!!&nbsp;->&nbsp;\(error)") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;managedObject&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println(&nbsp;"Error:&nbsp;structure&nbsp;for&nbsp;object&nbsp;was&nbsp;empty.&nbsp;this&nbsp;should&nbsp;not&nbsp;happen&nbsp;at&nbsp;this&nbsp;point") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;objectName:NSString&nbsp;=&nbsp;structureDictionary.objectForKey(&nbsp;"ManagedObjectName")&nbsp;as&nbsp;NSString &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;managedObject:NSManagedObject&nbsp;=&nbsp;NSEntityDescription.insertNewObjectForEntityForName(&nbsp;objectName,&nbsp;inManagedObjectContext:&nbsp;moc)&nbsp;as&nbsp;NSManagedObject &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;managedObject&nbsp;&nbsp;&nbsp;&nbsp;}}func&nbsp;dataStructuresFromManagedObjects(&nbsp;managedObjects:&nbsp;NSArray)&nbsp;->&nbsp;NSArray&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;dataArray:NSMutableArray&nbsp;=&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;managedObject&nbsp;in&nbsp;managedObjects&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataArray.addObject(&nbsp;self.dataStructureFromManagedObject(managedObject&nbsp;as?&nbsp;NSManagedObject)) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dataArray}这里的关键是将父实体作为参数传递给递归,因此我们可以决定用数据填充哪个关系。所以这两个函数:dataStructureFromManagedObject并且managedObjectFromStructure可以将来自CoreData的任何实体对象编码和解码为字典并返回到对象中。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答