我使用核心数据将一些数组存储为字符串。字符串以 STRINGFROMARRAY 为前缀,并以 &,& 分隔。
我认为重写 setter 和 getter 会很好,这样我就不必在每次需要访问时都提供代码来转换它们。我创建了一个名为 TestEntity 的托管对象子类,它只有一个属性“memberIds”(字符串)。我已经验证我的自定义 setter 和 getter 似乎工作正常:
测试实体.h:
@interface TestEntity (CoreDataGeneratedAccessors)
- (NSArray*)memberIds;
- (void)setMemberIds:(NSArray *)memberIds;
@end
测试实体.m:
@implementation TestEntity
@dynamic memberIds;
- (NSArray *)memberIds
{
[self willAccessValueForKey:@"memberIds"];
NSArray *memberIdsArray = [NSArray arrayWithArray:[[[self primitiveValueForKey:@"memberIds"] substringFromIndex:15] componentsSeparatedByString:@"&,&"]];
[self didAccessValueForKey:@"memberIds"];
return memberIdsArray;
}
- (void)setMemberIds:(NSArray *)memberIds
{
NSString *stringFromArray = [@"STRINGFROMARRAY" stringByAppendingString:[memberIds componentsJoinedByString:@"&,&"]];
[self willChangeValueForKey:@"memberIds"];
[self setPrimitiveValue:stringFromArray forKey:@"memberIds"];
[self didChangeValueForKey:@"memberIds"];
}
@end
我可以设置一个数组值并将其正确存储为字符串。我还可以valueForKey
在设置值后使用它来记录值,并将其正确打印为数组。
但是,当我尝试记录整个托管对象(没有 valueForKey:) 时,我收到 [NSArray length] 无法识别的选择器错误。
这是我用来测试的代码:
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:[SyncEngine sharedEngine].managedObjectContext];
[test setValue:[NSArray arrayWithObjects:@"1", @"2", @"3", nil] forKey:@"memberIds"];
NSLog(@"%@", [test valueForKey:@"memberIds"]);
NSLog(@"%@", test);
这是输出:
2013-08-24 13:59:27.820 0.1[1440:19d03] (
1,
2,
3
)
2013-08-24 13:59:27.820 0.1[1440:19d03] -[__NSArrayI length]: unrecognized selector sent to instance 0xa533800
为什么length
消息会发送到我的阵列?我怎样才能防止这种崩溃?谢谢!