我正在使用Core Data编写应用程序,这在很大程度上取决于从字符串值设置属性。但是,我遇到了一个问题,因为Core Data在创建包装器方法时使用NSNumber来表示所有数字字段。因此,如果我使用键/值编码setValue传递一个String:forKey:它给我一个类型错误:
例如,我有一个对象类型“Building”。在datamodel中,我有一个名为“fbFloors”的属性设置为整数32。
然后,在我的代码中,我执行以下操作:
构建* b = [NSEntityDescription insertNewObjectForEntityForName:@“Building”inManagedObjectContext:ctx]; [b setValue:@“2”forKey:@“fbFloors”];
这引发了以下异常:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'属性的值不可接受的类型:property =“fbFloors”;所需类型= NSNumber;给定type = __NSCFConstantString;值= 2。'
我希望将字符串值强制转换为数字,但它不想这样做。我尝试实现coerceValueForFbFloors:但它看起来只适用于Mac OS X,而不是iOS。
有什么想法吗?
答案 0 :(得分:1)
如果你这样做了怎么办......
- (NSNumber*)fbFloorsValue:(NSString*)valueString
{
return [NSNumber numberWithInteger: [valueString integerValue]];
}
您有每个非字符串属性的方法。然后,当您以通用方式设置这些值时......
假设你的密钥(“fbFloors”)在一个被调用的变量中,你的值(“2”)在一个名为...的变量中。
id valueObject;
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@Value:", key]);
if (selector && [self respondsToSelector:selector]) {
valueObject = [self performSelector:selector withObject:value];
} else {
valueObject = value;
}
Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:valueObject forKey:@key];
答案 1 :(得分:0)
您必须将NSNumber的实际实例传递给setValue。类似的东西:
[b setValue [NSNumber numberWithInt:2] forKey:@“fbFloors”];
如果您的数据显示为字符串,则可以使用NSNumberFormatter将其首先转换为NSNumber。