NSManagedObject - 如何获取属性的类型

时间:2010-12-13 01:00:06

标签: iphone core-data ios

我正在尝试将json字符串直接解析为托管对象。 json字符串包含所有字符串,但我的Entity具有Date对象。

如果这是我的json字符串

{
"name":"John",
"dob": "12/12/2008",
etc...
}

这是我的实体人:

name : NSString
dob: Date
etc...

我想通过循环遍历Json dict的键并将值设置为我的实体的匹配键来直接解析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时才有效。

如何获取实体属性的类型/类才能设置各种类型?

例如。 如果key = @“dob” 我如何获得aPerson.dob的类型/类?

所以我的代码看起来像:

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,不是OfClass NSDate!

请告诉我我错过了什么!

3 个答案:

答案 0 :(得分:3)

我知道,这是一个迟到的答案,但我今天正在寻找一个好的解决方案...... 这就是我现在正在使用的:

NSEntityDescription * myEntity = [object entity];
NSDictionary * attributes = [myEntity attributesByName];
if ([[[attributes objectForKey:key] attributeValueClassName] isEqualToString:@"NSDate"]) {
    // this type is NSDate
}                        

希望这会有所帮助:)

答案 1 :(得分:1)

您可以将JSON字符串转换为NSDate,然后将其分配给NSManagedObject,也可以在Person类中创建一个自定义setter,它接受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;
}

答案 2 :(得分:0)

非常感谢罗格,为了让我朝着正确的方向前进,我最终压倒了我的二传手,如下所示:

-(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行代码解析,所有这些都在3中完成! 好一个!