CoreData 在返回数组时需要一个字符串,在返回一个字符串时需要 NSData
Posted
技术标签:
【中文标题】CoreData 在返回数组时需要一个字符串,在返回一个字符串时需要 NSData【英文标题】:CoreData expects a string when returning an array and NSData when returning a string 【发布时间】:2012-02-29 17:26:25 【问题描述】:我有一个简单的 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
在使用调试器时从未被“触及”。
【问题讨论】:
【参考方案1】:您提供的代码没有错误。问题在于您的 CoreData 方法。
当您在 CoreData 中使用转换后的属性时,该值将作为 NSData 对象存储在数据库中。您的错误中的长度与 NSData length 方法有关。
因此,您应该为 NSValueTransformer 提供从 NSData 到 NSArray 的转换并反向将串联数组作为 NSData 放入 CoreData。
如果您想保留将属性存储为 NSString 的可能性,您可以实现对托管对象的 NSString 属性的特殊访问器,这会将 NSString 转换为 NSArray 值或在 CoreData 模型之外使用 NSValueTransformer,如下所示:
NSValueTransformer *transformer = [NSValueTransformer valueTransformerForName:@"StringToArrayValueTransformer"];
NSArray *array = [transformer transformedValue:yourEntityItem.yourStringProperty];
【讨论】:
但是我不能创建一个转换器,将数字从“一”转换为“十”到数字 1 - 10。它必须是 NSData 吗? 请注意,只有 Objective-C 对象可以存储到 CoreData。所以除了 NSNumber、NSDate、NSString 或 NSData 之外没有数字。我无法理解你给你一些建议的主要目标。但也许您最好在模型和一对多关系中添加一些额外的对象,以便为您的实体添加一些字符串。它可能是更优雅、更有效的解决方案。【参考方案2】:需要将值转换为 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;
【讨论】:
否定,我仍然遇到同样的错误,我还检查了结果实际上是我在调试器中期望的数组......我认为NSString *languages = value;
是一个隐式转换,因为语言是NSString* 类型的。以上是关于CoreData 在返回数组时需要一个字符串,在返回一个字符串时需要 NSData的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI Picker 从 CoreData 返回空字符串