CoreData在返回数组时需要一个字符串,在返回字符串时需要NSData

时间:2012-02-29 17:26:25

标签: iphone objective-c ios core-data nsvaluetransformer

我有一个简单的NSValueTransformer,它应该将逗号分隔的字符串first, second, third转换为数组。因此,在我的CoreData架构中,我将属性options设置为Transformed并指定我的Transformer。

这是我的变形金刚:

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        // return result;
        return @"test Result";
    }
}

现在当我返回变量result时,我收到以下错误(length看起来好像期待NSString):

... 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x6cc59a0'

如果我返回上面的测试字符串,我会收到此错误(bytes看起来好像是期待NSData个对象):

... 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0xf0780'

看起来似乎有一个我似乎没有掌握的概念性问题。同样奇怪的是,+(Class)transformedValueClass+(BOOL)allowsReverseTransformation在使用调试器时永远不会被“触及”。

2 个答案:

答案 0 :(得分:2)

您提供的代码中没有错误。问题在于你的CoreData方法。

在CoreData中使用转换属性时,该值将作为 NSData 对象存储在数据库中。错误中的长度与 NSData长度方法有关。

因此,您应该为NSValueTransformer提供从NSData到NSArray的转换,并反向将连接数组作为NSData放入CoreData。

如果你想保留将属性存储为NSString的可能性,你可以实现托管对象的NSString属性的特殊访问器,它将NSString转换为NSArray值或在你的CoreData模型之外使用你的NSValueTransformer,如下所示:

NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];

答案 1 :(得分:-1)

需要将值强制转换为NSString尝试此

-(id)transformedValue:(id)value{
    // convert it to an array
    if(!value){
        return nil;
    } else{
        NSString *languages = (NSString*)value;
        NSArray *result = [languages componentsSeparatedByString: @", "];
        return result;

    }
}