如何取消归档NSManagedObject

时间:2013-07-23 12:28:45

标签: ios objective-c core-data

由于我们无法直接将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数组保存为NSData
NSData *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'

1 个答案:

答案 0 :(得分:2)

您在self = [self init]中呼叫initWithCoder:,需要致电self = [super initWithCoder:aDecoder]。但即便如此,我也不确定它会起作用。核心数据管理自己的对象(因此名称为NSManagedObject),因此我不知道通过NSKeyed(Un)Archiver自己存储它们是否会为您带来好处。

您最好的选择是使用核心数据关系,以便它可以为您处理所有存储。