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