0

我在 CoreData 中设置的关系有问题。它是一对多的,一个客户可以有多个联系人,这些联系人来自通讯录。

我的模型看起来像这样:

Customer <---->> Contact
Contact  <-----> Customer

联系人.h

@class Customer;

@interface Contact : NSManagedObject

@property (nonatomic, retain) id addressBookId;
@property (nonatomic, retain) Customer *customer;

@end

客户.h

@class Contact;

@interface Customer : NSManagedObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *contact;

@end

@interface Customer (CoreDataGeneratedAccessors)

- (void)addContactObject:(Contact *)value;
- (void)removeContactObject:(Contact *)value;
- (void)addContact:(NSSet *)values;
- (void)removeContact:(NSSet *)values;

@end

并尝试保存:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
Customer *customer = (Customer *)[NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:context];

[customer setValue:name forKey:@"name"];

for (id contact in contacts) {
    ABRecordRef ref = (__bridge ABRecordRef)(contact);
    Contact *contact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];

    [contact setValue:(__bridge id)(ref) forKey:@"addressBookId"];
    [customer addContactObject:contact];
}

NSError *error;

if ([context save:&error]) { // <----------- ERROR
    // ...
}

使用我的代码,我有这个错误:

-[__NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x9c840c0
*** -[NSKeyedArchiver dealloc]: warning: NSKeyedArchiver deallocated without having had -finishEncoding called on it.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType encodeWithCoder:]: unrecognized selector sent to instance 0x9c840c0'

任何建议,将不胜感激。

4

1 回答 1

3

问题是addressBookId(正如您在评论中提到的)定义为Contact实体上的可转换属性。但是(正如您在评论中提到的那样)您没有任何自定义代码来实际将 anABRecordRef转换为 Core Data 知道如何存储的东西。在没有自定义转换器的情况下,Core Data 将尝试通过调用值来转换encodeWithCoder:值。但ABRecordRef不符合NSCoding,所以这会失败并且您的应用程序崩溃。

如果你想ABRecordRef在 Core Data 中存储,你需要创建一个NSValueTransformer子类并在你的数据模型中配置它。你的转换器需要转换ABRecordRef成 Core Data 知道的一种类型。我还没有充分使用地址簿 API 来就这方面的细节提供建议,但 Apple 的文档NSValueTransformer非常好。

这是一对多关系的事实是无关紧要的。问题是如果ABRecordRef不进行一些转换就无法进入您的数据存储。

于 2013-02-04T22:15:09.180 回答