2012-02-29 39 views
2

我有一个简单的NSValueTransformer,它应该将逗号分隔的字符串first, second, third转换为数组。所以在我的CoreData架构中,我有属性options,我将其设置为Transformed并指定我的Transformer。CoreData在返回字符串时返回数组和NSData时需要一个字符串

这是我的变压器:

-(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

有在代码中没有错误,你提供。这个问题存在于你的CoreData方法中。

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

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

如果你想保持存储财产的NSString的可能性,可以实现特殊的访问到你的管理对象的NSString财产,这将改变的NSString NSArray的值或使用您的NSValueTransformer您的CoreData模型之外是这样的:

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

但我无法创建一个变换器,将数字从“one”变为“ten”,变成数字1 - 10.它是否必须是NSData? – Besi 2012-02-29 21:09:14

+0

考虑到只有Objective-C对象可以存储到CoreData中。所以除了NSNumber,NSDate,NSString或NSData之外,没有数字。我不明白你的主要目标是给你一些建议。但是,也许你最好在你的模型中添加一些额外的对象,并且将一对多关系添加到你的实体中。这可能是更优雅和有效的解决方案。 – voromax 2012-02-29 21:26:52

-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; 

    } 
} 
+0

否定的,我仍然得到了同样的错误,我也检查了结果实际上是我期望在调试器中的数组...我认为'NSString * languages = value;'是一个隐式转换,因为语言的类型是NSString *。 – Besi 2012-02-29 18:12:34