2

我正在使用 Core Data 编写一个应用程序,该应用程序严重依赖于从字符串值设置属性。但是,我遇到了一个问题,因为 Core Data 在创建包装器方法时使用 NSNumber 来表示所有数字字段。因此,如果我使用键/值编码 setValue:forKey: 传入一个字符串,它会给我一个类型错误:

例如,我有一个对象类型“建筑”。在数据模型中,我有一个名为“fbFloors”的属性设置为整数 32。

然后,在我的代码中,我执行以下操作:

Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:@"2" forKey:@"fbFloors"];

这会引发以下异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“属性的值类型不可接受:property = “fbFloors”;所需类型 = NSNumber; 给定类型 = __NSCFConstantString; 值 = 2。

我希望它将字符串值强制为数字,但它不想。我尝试实现 coerceValueForFbFloors: 但它看起来只在 Mac OS X 中可用,而不是在 iOS 中。

有任何想法吗?

4

2 回答 2

1

What if you did something like this...

- (NSNumber*)fbFloorsValue:(NSString*)valueString
{
    return [NSNumber numberWithInteger: [valueString integerValue]];
}

where you have a method for each non-string attribute. Then when you set those values in a generic way...

Assume your key ("fbFloors") is in a variable called and your value ("2") is in a variable called ...

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];
于 2012-04-15T04:39:02.523 回答
0

您必须将 NSNumber 的实际实例传递给 setValue。就像是:

[b setValue[NSNumber numberWithInt:2] forKey:@"fbFloors"];

如果您的数据显示为字符串,那么您可以使用 NSNumberFormatter 首先将其转换为 NSNumber。

于 2012-04-11T15:40:04.723 回答