【问题标题】:How to Unarchive NSManagedObject如何取消归档 NSManagedObject
【发布时间】:2013-07-23 21:39:38
【问题描述】:

由于我们不能直接将 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'

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    你在initWithCoder:中调用self = [self init],你需要调用self = [super initWithCoder:aDecoder]。但即便如此,我也不确定这是否会奏效。 Core Data 管理自己的对象(因此得名 NSManagedObject),所以我不知道通过 NSKeyed(Un)Archiver 自己存储它们是否会为您带来好结果。

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

    【讨论】:

    • self init 将调用超类中的 init 实现。有没有其他方法可以将 ManagedObject 数组存储到另一个 managedObject 中?
    • 您可能只想使用 Core Data 关系。它不完全是一个数组,但一个简单的 fetch 请求会给你一个NSSet,你可以将它转换为一个 NSArray。如果订单很重要,您甚至可以使用NSOrderedSet。
    • 如果我将属性的访问器类型从“@dynamic”更改为“@synthesis”,它不会崩溃,但这不是解决方案。我想保留属性“@dynamic”
    • 你是对的;它不会有好的结局。 CoreData 的重点是在您建模的模式中管理 NSManagedObjects 的复杂图。这包括完全包含数组的关系,如包含。 OP 应该使用“一对多”关系来模拟一个实体与另一个实体的许多关系。
    • @iVishal 太好了!!一般来说,如果你发现自己在与框架作斗争,那是因为你违背了推荐的使用模式。找到应该很容易的东西却很困难?退后一步,查看概念指南。我从事这方面的工作(ObjC 与 NeXT 派生的 API)已经近 25 年了,而且我仍然定期阅读概念指南。尤其是每个新的操作系统版本。
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多