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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 时是不是需要本地数组?

swift中的核心数据数组

SwiftUI Picker 从 CoreData 返回空字符串

在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词

CoreData 可以返回唯一的实体属性吗?

必须从 CoreData 调用 fetch 两次