0

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

2行目で例外が発生しています。

キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[MyClass setCanPay:]: 認識されないセレクターがインスタンス 0x743c950 に送信されました'

4

1 に答える 1

2

self = [self init]に電話しています。initWithCoder:電話する必要がありますself = [super initWithCoder:aDecoder]。しかし、それでもうまくいくかどうかはわかりません。Core Data は独自のオブジェクトを管理するため (名前の由来NSManagedObject)、 を使用して自分でオブジェクトを保存することがうまくいくかどうかはわかりませんNSKeyed(Un)Archiver

最善の策は、Core Data リレーションシップを使用して、すべての保存を処理できるようにすることです。

于 2013-07-23T12:38:31.573 に答える