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

时间:2012-02-18 19:00:01

标签: iphone ios cocoa-touch core-data

我正在尝试使用核心数据NSValueTransformerNSArray转换为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):

[26364:11903] !!!!!! __NSCFString, 0,0
[26364:11903] -[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620
[26364:11903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620'

有什么想法吗?请!!


编辑:

好吧,我只是将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];
}

!!!注意这里

但我想知道这是否正确?正如您所见,return [NSArray class]方法中的transformedValueClass,但实际上在NSData中返回transformedValue:类型数据值。

苹果DOC说:

  

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

我完全糊涂了......

1 个答案:

答案 0 :(得分:2)

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

我个人希望将来能够将Core Data转换为字符串,所以例如在使用SQLite浏览器时,记录字段是人类可读的,而不是二进制plist。

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