NSManagedObject - 如何获得属性的类型
我想解析一个json字符串直接进入一个托管对象。 json字符串包含所有字符串,但我的实体具有Date对象。NSManagedObject - 如何获得属性的类型
如果这是我的JSON字符串
{
"name":"John",
"dob": "12/12/2008",
etc...
}
,这里是我的实体联系人:
name : NSString
dob: Date
etc...
我想通过JSON的字典的键循环直通解析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];
}
}
感谢
UPDATE:
好吧,我尝试使用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,不是一个类NSDate!
请告诉我,我错过了什么!
非常感谢给罗格,送我在正确的方向,我结束了重写我的setter方法如下:
-(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! 不错的一个!
不错的解决方案,干净整洁。感谢您发布它! – Rog 2010-12-13 04:54:11
您可以您的JSON字符串转换为NSDate的,然后将其分配给您的NSManagedObject,或者你可以创建你的Person类的自定义设置器,它需要一个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;
}
谢谢罗格,但我仍然需要知道什么时候应该将字符串转换为日期。我需要知道person.xx中xx的类型,才能动态创建它们的对象。例如。 person.dob,person.loginDate等...如果我可以告诉他们都是NSDate属性,那么我可以创建一个NSDate出该json字符串。 – Bach 2010-12-13 01:21:24
我也想过重写setter以使用NSString创建NSDate,但是每次我想在应用程序中设置“dob”时,我总是会使用字符串。 – Bach 2010-12-13 01:24:32
不一定。您可以传递(id)而不是NSString,然后在您的setter中使用'isKindOfClass'进行条件评估。 – Rog 2010-12-13 01:53:13
我知道,这是一个迟到的回答,但我今天寻找一个好的解决方案... 这是我使用的是什么现在:
NSEntityDescription * myEntity = [object entity];
NSDictionary * attributes = [myEntity attributesByName];
if ([[[attributes objectForKey:key] attributeValueClassName] isEqualToString:@"NSDate"]) {
// this type is NSDate
}
希望这有助于:)
或者给我的回答如下,您可以运行一个,如果([键isEqualToString:“DOB”])上面的代码{//创建NSDate的对象...} – Rog 2010-12-13 01:11:57
感谢罗格,但我希望让更多的解析动态,只需拾取实体属性的类型而不必知道密钥的名称即。 “dob” – Bach 2010-12-13 01:17:25
是的所有公平点。这是未经测试的如何使用'if([[movie valueForKey:key] isKindOfClass:[NSDate class]])' – Rog 2010-12-13 01:42:17