NSManagedObject – 如何获取属性的types
我试图parsing一个JSONstring直接进入一个托pipe对象。 JSONstring包含所有string,但我的实体有Date对象。
如果这是我的JSONstring
{ "name":"John", "dob": "12/12/2008", etc... }
这是我的实体Person:
name : NSString dob: Date etc...
我想通过循环Json字典的键来parsing该json,并将值设置为我实体的匹配键:
Person *aPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext]; NSArray *keys = [jsonDict allKeys]; for (NSString *key in keys) { [aPerson setValue:[jsonDict valueForKey:key] forKey:key]; }
这只适用于所有我的实体的属性是NSStrings。
我怎样才能得到我的实体属性的types/类能够设置各种types?
例如。 如果key = @“dob”我怎么能得到aPerson.dob的types/类?
所以我的代码看起来像这样:
Person *aPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext]; NSArray *keys = [jsonDict allKeys]; for (NSString *key in keys) { if([[aPerson objectForKey:key] isKindOfClass:[NSDate class]]) { // Create an NSDate object }else{ [aPerson setValue:[jsonDict valueForKey:key] forKey:key]; } }
谢谢
更新:
好吧,我尝试使用isKindOfClass,这里的结果是:
// for key = @"name" // aPerson.name is NSString [[aPerson valueForKey:key] isKindOfClass:[NSString class]] => TRUE [[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => TRUE // for key = @"age" // aPerson.age is NSNumber [[aPerson valueForKey:key] isKindOfClass:[NSNumber class]] => TRUE [[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => TRUE // for key = @"dob" // aPerson.dob is NSDate [[aPerson valueForKey:key] isKindOfClass:[NSDate class]] => FALSE [[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => FALSE
那个怎么样? @dynamic dob和NSDate,不是NSFate!
请告诉我我错过了什么!
我知道,这是一个迟到的答案,但正如我今天search一个很好的解决scheme…这就是我现在使用的:
NSEntityDescription * myEntity = [object entity]; NSDictionary * attributes = [myEntity attributesByName]; if ([[[attributes objectForKey:key] attributeValueClassName] isEqualToString:@"NSDate"]) { // this type is NSDate }
希望这可以帮助 :)
您可以将您的JSONstring转换为NSDate,然后将其分配给您的NSManagedObject,或者您可以在Person类中创build一个自定义设置器,该设置器需要一个NSString并返回NSDate。 这是一个例子:
- (NSDate*)convertStringToDate:(NSString*)dateString { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // this is imporant - we set our input date format to match our input string // if format doesn't match you'll get nil from your string, so be careful [dateFormatter setDateFormat:@"d MMMM yyyy"]; NSDate *dateFromString = [dateFormatter dateFromString:dateString]; [dateFormatter release]; return dateFromString; }
非常感谢Rog,为了让我朝着正确的方向发展,我最终超越了我的二传手,如下所示:
-(void)setDob:(id)value { [self willAccessValueForKey:@"dob"]; if ([value isKindOfClass:[NSString class]]) { [self setPrimitiveValue:[DateFormatter dateFromString:value] forKey:@"dob"]; }else{ [self setPrimitiveValue:value forKey:@"dob"]; } [self didChangeValueForKey:@"dob"]; }
而且现在所有的工作都很好,而不是1000行的代码parsing,所有这些都在3个! 好一个!