如何设计对象图形/模型?
问题描述:
JSON As Dictionary { headers = ( { backGroundImageUrl = ""; dataField = Name; headerText = Name; id = Name; itemRenderer = ""; toolTip = ""; width = 60; }, { backGroundImageUrl = ""; dataField = BidPrice; headerText = Bid; id = BidPrice; itemRenderer = ""; toolTip = "Bid Price"; width = 30; }); values = ( { assetCellValueLst = { AskColorCode = "#B8D1ED"; AskPrice = "102.20"; BidColorCode = "#B8D1ED"; BidPrice = "102.00"; Name = "AR Bonar 11"; PECSAsk = 569; PECSChg = "(31)"; PECSChgColorCode = "#000000"; PriceChg = "0.00"; PriceChgColorCode = "#000000"; SOLAsk = 604; SSPAsk = 677; SSPChgDay = "+3"; SSPChgDayColorCode = "#000000"; YTMAsk = "6.97"; assetGroupName = Argentina; assetId = ARBONAR11; iconPath = "images/flag_Argentina.gif"; updated = false; }; assetId = ARBONAR11; }, { assetCellValueLst = { AskColorCode = "#53840f"; AskPrice = "84.00"; BidColorCode = "#53840f"; BidPrice = "83.75"; Name = "AR Bod 15"; PECSAsk = 945; PECSChg = 14; PECSChgColorCode = "#000000"; PriceChg = "-0.10"; PriceChgColorCode = "#53840F"; SOLAsk = 985; SSPAsk = 1007; SSPChgDay = "+7"; SSPChgDayColorCode = "#000000"; YTMAsk = "11.74"; assetGroupName = Argentina; assetId = ARBON15; iconPath = "images/flag_Argentina.gif"; updated = false; }; assetId = ARBON15; });
为清晰起见,上面的JSON有更多的标题和值缩短。 assestCellValueLst Dictionary可以具有更多或更少的键值对,具体取决于业务逻辑。标题字典也是如此。我应该如何在Xcode中创建对象模型以将其与Core Data Managed Objects结合使用?对于非持久性商店或根本没有商店如何设计对象图形/模型?
答
简单地说,您只需为要保留的每种字典类型创建一个实体,并为字典中的每个键都有一个属性。
在这种情况下,您会看到两个实体:Header
和Asset
。如果头部有资产一对一的关系,你可能有这样的(伪)实体:
Header{
backGroundImageUrl = string;
dataField = string;
headerText = string;
id = string;
itemRenderer = ?;
toolTip = ?
width = integer;
asset<--(required,cascade)-->Asset.header
}
Asset{
assetId = string;
askColorCode = string;
askPrice = float;
bidColorCode = string;
bidPrice = float;
//...etc
header<--(required,nullify)-->Header.asset
}
的基本思路是,该模型,很好,“模型”无论现实世界对象,事件,条件或者你想要坚持的信息。在这种情况下,JSON提供了漂亮,整洁的字典,所有数据已经组织并标记给您。
答
+(NSArray *)managedObjectsFromJSONDictionary:(NSDictionary *)dictionary withManagedObjectContext:(NSManagedObjectContext *)moc { NSMutableArray *finalArrayOfArrays = [[NSMutableArray alloc] init]; NSArray *allKeys = [dictionary allKeys]; for(NSString *keyName in allKeys) { id structureArray = [dictionary valueForKey:keyName]; if([structureArray isKindOfClass:[NSArray class]]) { NSMutableArray *objectArray = [[NSMutableArray alloc] init]; for(NSDictionary *structureDictionary in (NSArray *)structureArray) { [objectArray addObject:[JSONtoManagedObject managedObjectFromDictionary:structureDictionary withManagedObjectContext:moc forEntity:keyName]]; } [finalArrayOfArrays addObject:objectArray]; [objectArray release]; } } return [finalArrayOfArrays autorelease]; } +(NSManagedObject *)managedObjectFromDictionary:(NSDictionary *)dictionary withManagedObjectContext:(NSManagedObjectContext *)moc forEntity:(NSString *)entityName { NSManagedObject *managedObject; NSArray *arrayOfKeys = [dictionary allKeys]; for(NSString *name in arrayOfKeys) { id obj = [dictionary objectForKey:name]; managedObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:moc]; if (![obj isKindOfClass:[NSDictionary class]]) { if([name isEqualToString:@"id"]) [managedObject setValue:obj forKey:@"uniqueID"]; else [managedObject setValue:obj forKey:name]; } else { NSDictionary *relationshipDictionary = [[managedObject entity] relationshipsByName]; for(NSString *relationshipName in [relationshipDictionary allKeys]) { NSRelationshipDescription *relationshipDescription = [relationshipDictionary objectForKey:relationshipName]; if(![relationshipDescription isToMany] && [relationshipName isEqualToString:name]) { NSManagedObject *childObject = [JSONtoManagedObject managedObjectFromDictionary:obj withManagedObjectContext:moc forEntity:relationshipName]; [managedObject setValue:childObject forKey:relationshipName]; continue; } NSMutableSet *relationshipSet = [managedObject mutableSetValueForKey:relationshipName]; NSArray *relationshipArray = [obj valueForKey:relationshipName]; for(NSDictionary *insideDictoinary in relationshipArray) { NSManagedObject *childObject = [JSONtoManagedObject managedObjectFromDictionary:insideDictoinary withManagedObjectContext:moc forEntity:relationshipName]; [relationshipSet addObject:childObject]; } } }//end else } // for return managedObject; }
+0
我的模型有头作为一个实体,和值与assestCellValueLst的实体当作一个与值一一对应关系,我得到的所有头键值零除UNIQUEID,我不得不这样做,因为身份证被视为一个保留字,并为我创造了问题... – user400579 2010-07-25 20:03:48
非常感谢你 – user400579 2010-07-25 20:04:35