Objective c “NSInvalidArgumentException”,原因:“多对多关系的不可接受的值类型:property=“detail”;

Objective c “NSInvalidArgumentException”,原因:“多对多关系的不可接受的值类型:property=“detail”;,objective-c,core-data,Objective C,Core Data,以下是我的数据模型: 这是我的密码: NSManagedObjectContext *context = [self managedObjectContext]; NSManagedObject *failedBankInfo = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankInfo" inManagedObjectContext:context]; [failedBankInfo setValue:@"Tes

以下是我的数据模型:

这是我的密码:

NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *failedBankInfo = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankInfo" inManagedObjectContext:context];
[failedBankInfo setValue:@"Test Bank" forKeyPath:@"name"];
[failedBankInfo setValue:@"Testville" forKeyPath:@"city"];
[failedBankInfo setValue:@"Testland" forKeyPath:@"state"];

NSManagedObject *failedBankDetails = [NSEntityDescription insertNewObjectForEntityForName:@"FailedBankDetail" inManagedObjectContext:context];
[failedBankDetails setValue:[NSDate date] forKey:@"closeDate"];
[failedBankDetails setValue:[NSDate date] forKey:@"updateDate"];
[failedBankDetails setValue:[NSNumber numberWithInt:12345] forKey:@"zip"];
[failedBankDetails setValue:failedBankInfo forKeyPath:@"info"];
[failedBankInfo setValue:failedBankDetails forKey:@"detail"];

NSError *error;
if(![context save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
    NSLog(@"Name: %@", [info valueForKey:@"name"]);
    NSManagedObject *details = [info valueForKey:@"details"];
    NSLog(@"Zip: %@", [details valueForKey:@"zip"]);
}
以下是跟踪日志:

2014-07-14 14:56:57.080 FailedBankCD[87194:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-many relationship: property = "detail"; desired type = NSSet; given type = NSManagedObject; value = <NSManagedObject: 0x8c452d0> (entity: FailedBankDetail; id: 0x8c63740 <x-coredata:///FailedBankDetail/t5A5AD25D-C89A-4FA2-A776-C91A3F0413083> ; data: {
    closeDate = "2014-07-14 10:56:55 +0000";
    info = "0x8c60b40 <x-coredata:///FailedBankInfo/t5A5AD25D-C89A-4FA2-A776-C91A3F0413082>";
    updateDate = "2014-07-14 10:56:55 +0000";
    zip = 12345;
}).'
*** First throw call stack:
(

问题的原因是什么?我如何解决它?

那么,我将更清楚地说明:

而不是

[failedBankInfo setValue:failedBankDetails forKey:@"detail"];
使用

让魔法发生吧。
关键是,你确实有一对多,由一个集合来表示。因此,不要使用单个托管对象覆盖集合,而是添加它。

只需查看NSManagedObjects的头文件即可。FailedBankInfo类与FailedBankDetail具有多对多关系。这意味着1 FailedBankInfo可以有多个FailedBankDetail对象引用,并意味着详细信息关系是一个NSSet。反向是一对一关系,因此它是一个简单的FailedBankDetail对象。您的问题在于这一行:

[failedBankInfo setValue:failedBankDetails forKey:@"detail"];

您需要分配一组FailedBankDetail对象,即使它是一组1对象。FailedBankInfo的标题中定义了一些方便的方法,使这项工作变得容易。

这将帮助您:谢谢。我知道我可以将我的关系从“到多”更改为“到一”,我的代码将正常工作。但我的知识不足以修改我的代码,使其与“对多”关系一起使用。所以我会感谢你给我的任何提示。嗯。。。我找不到NSManagedObject的addDetail方法。我的Xcode确认了这一点。这不是NSManagedObject实现的方法。在源代码中,应该有一个FailedBankInfo.h扩展NSManagedObject。您的核心数据方案声明,该类具有存储连接的FailedBankDetail对象的detail属性。addDetail可以方便地自动生成以处理此方案连接。如果您没有FailedBankInfo.h,您可以通过xcode自动生成它,方法是转到核心数据方案,在那里标记FailedBankInfo类,然后从xcode菜单中选择File->New->File,并从核心数据组中选择NSManagedObject子类。
[failedBankInfo addDetail:failedBankDetails];
[failedBankInfo setValue:failedBankDetails forKey:@"detail"];