Iphone 通过NSValueTransformer将字符串转换为核心数据

Iphone 通过NSValueTransformer将字符串转换为核心数据,iphone,ios,cocoa-touch,core-data,Iphone,Ios,Cocoa Touch,Core Data,我正在尝试使用核心数据NSValueTransformer将NSArray转换为NSString。我不确定是否可以存档,但我看到苹果的官方文件显示了一段代码片段: @interface ClassNameTransformer: NSValueTransformer {} @end @implementation ClassNameTransformer + (Class)transformedValueClass { return [NSString class]; } + (BOOL)all

我正在尝试使用核心数据
NSValueTransformer
NSArray
转换为
NSString
。我不确定是否可以存档,但我看到苹果的官方文件显示了一段代码片段:

@interface ClassNameTransformer: NSValueTransformer {}
@end
@implementation ClassNameTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
  return (value == nil) ? nil : NSStringFromClass([value class]);
}
@end
它似乎可以将数据存储到
NSString
(可能我误解了…),所以我尝试如下:

@implementation ArrayToStringTransformer

+ (BOOL)allowsReverseTransformation {
  return YES;
}

+ (Class)transformedValueClass {
  return [NSString class];
}

- (id)transformedValue:(id)value {
//  return NSStringFromClass([value class]);
//  return NSStringFromClass([@"11" class]);

  NSLog(@"!!!!!! %@, %@", NSStringFromClass([value class]), value);
  if ([value isKindOfClass:[NSString class]])
    return NSStringFromClass([value class]);

  NSMutableString * string = [NSMutableString string];
  for (NSNumber * number in value)
    [string appendString:[NSString stringWithFormat:@"%@,", number]];
  return string;
}

- (id)reverseTransformedValue:(id)value {
  NSArray * array = [value componentsSeparatedByString:@","];
  return array;
}

@end
但是,它崩溃时出现以下错误(包括NSLog):

有什么想法吗?求你了


编辑: 好的,我只是将
NSArray
转换为
NSData
,如果它是
NSString
类型,首先将它转换为
NSArray
,然后再转换为
NSData
,它可以工作:

+ (Class)transformedValueClass {
  return [NSArray class];
}

- (id)transformedValue:(id)value {
  if (! [value isKindOfClass:[NSString class]])
    return [NSKeyedArchiver archivedDataWithRootObject:value];

  NSLog(@"!!! Convert NSString to NSArray");
  NSArray * array = [value componentsSeparatedByString:@","];
  NSData * data = [NSKeyedArchiver archivedDataWithRootObject:array];
  return data;
}

- (id)reverseTransformedValue:(id)value {
  return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}
!!! 注意这里 但我想知道这是否是一种正确的方式?如您所见,我在
transformedValueClass
方法中返回[NSArray class],但实际上返回
NSData
transformedValue:
中键入数据值

苹果医生说:

一个NSData对象,包含对象图的编码形式,其根对象是rootObject


我完全糊涂了…

目前核心数据只能转换为NSData。默认转换器可以通过将属性类型设置为transformable来处理将字符串数组转换为NSData的操作,这是唯一需要的配置

就我个人而言,我希望将来的核心数据允许转换为字符串,因此,例如,当使用SQLite浏览器时,记录字段是人类可读的,而不是二进制plist


他们可能没有包含此功能的一个理论是,如果您试图包含一个字符串数组,那么最好使用多对多关系来实现您试图存储的内容。

上面哪一行生成了无法识别的选择器错误?@noa当使用以下结果时:(
result.entity
)它会导致错误,但是,我选择使用NSData。谢谢!
+ (Class)transformedValueClass {
  return [NSArray class];
}

- (id)transformedValue:(id)value {
  if (! [value isKindOfClass:[NSString class]])
    return [NSKeyedArchiver archivedDataWithRootObject:value];

  NSLog(@"!!! Convert NSString to NSArray");
  NSArray * array = [value componentsSeparatedByString:@","];
  NSData * data = [NSKeyedArchiver archivedDataWithRootObject:array];
  return data;
}

- (id)reverseTransformedValue:(id)value {
  return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}