2010-07-23 79 views
0
 
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结合使用?对于非持久性商店或根本没有商店如何设计对象图形/模型?

回答

0

简单地说,您只需为要保留的每种字典类型创建一个实体,并为字典中的每个键都有一个属性。

在这种情况下,您会看到两个实体:HeaderAsset。如果头部有资产一对一的关系,你可能有这样的(伪)实体:

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提供了漂亮,整洁的字典,所有数据已经​​组织并标记给您。

+0

非常感谢你 – user400579 2010-07-25 20:04:35

0
 

+(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