由于我们无法直接将NSArray存储在核心数据中,因此我通过将数组转换为NSData将NSManagedObject数组存储到另一个NSManagedObject中。存储在该数组中的NSManagedObject符合NSCoding协议,我在这些类中实现了NSCoding协议的方法,以便将它们存档。
@implementation MyClass
- (void)encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject: [self canPay] forKey: @"canPay"];
[coder encodeObject: [self guestId] forKey: @"guestId"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if((self = [self init]))
if (self)
{
[self setCanPay: [aDecoder decodeObjectForKey: @"canPay"]];
[self setGuestId: [aDecoder decodeObjectForKey: @"guestId"]];
}
return self;
}
使用以下代码行
将MyClass数组保存为NSDataNSData *myData = [NSKeyedArchiver archivedDataWithRootObject:arrayContainingMyClass];
[myEntity setMyClassData:myData];
问题是在取消myClassData的时候,我得到了例外......
NSData *newdata = [NSData dataWithData:myEntity.myClassData];
NSMutableArray *arr = [NSMutableArray arrayWithArray: [NSKeyedUnarchiver unarchiveObjectWithData:newdata]];
在第二行我得到例外,
由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:' - [MyClass setCanPay:]: 无法识别的选择器发送到实例0x743c950'
答案 0 :(得分:2)
您在self = [self init]
中呼叫initWithCoder:
,需要致电self = [super initWithCoder:aDecoder]
。但即便如此,我也不确定它会起作用。核心数据管理自己的对象(因此名称为NSManagedObject
),因此我不知道通过NSKeyed(Un)Archiver
自己存储它们是否会为您带来好处。
您最好的选择是使用核心数据关系,以便它可以为您处理所有存储。