【问题标题】:'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-many relationship: property = "detail";'NSInvalidArgumentException',原因:'对多关系不可接受的值类型:property = "detail";
【发布时间】:2023-03-31 10:31:01
【问题描述】:

这是我的数据模型:

这是我的代码:

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

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

【问题讨论】:

  • 这将对您有所帮助:stackoverflow.com/questions/16082133/…
  • 谢谢。我知道我可以将我的关系从“对多”更改为“对一”,并且我的代码将起作用。但是我的知识不足以修改我的代码以将其与“对多”关系一起使用。所以我会感谢任何提示。

标签: objective-c core-data


【解决方案1】:

好吧,那我会更清楚地说明这一点:

而不是

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

使用

[failedBankInfo addDetail:failedBankDetails];

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

【讨论】:

  • 嗯...我找不到 NSManagedObject (developer.apple.com/library/mac/documentation/Cocoa/Reference/…) 的 addDetail 方法。我的 Xcode 确认了。
  • 那是 NSManagedObject 没有实现的方法。在您的 Source 中,您应该有一个扩展 NSManagedObject 的 FailedBankInfo.h。您的核心数据方案指出,该类有一个 detail 属性,用于存储连接的 FailedBankDetail 对象。 addDetail 方便地自动生成以解决此方案连接。
  • 如果您没有 FailedBankInfo.h,您可以通过 xcode 自动生成它,方法是转到您的核心数据方案,在此处标记 FailedBankInfo 类,然后从 Xcode 菜单中选择 File->New->File 并从核心数据组中选择“NSManagedObject 子类”。
【解决方案2】:

只需查看 NSManagedObject(s) 的头文件。您的 FailedBankInfo 类与 FailedBankDetail 具有一对多关系。这意味着 1 个 FailedBankInfo 可以有许多 FailedBankDetail 对象引用,并暗示明细关系是一个 NSSet。逆是一对一的关系,所以它是一个简单的 FailedBankDetail 对象。你的问题在于这一行:

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

您需要分配一个 NSSet(FailedBankDetail 对象,即使它是一组 1 个对象)。在 FailedBankInfo 的标头中定义了一些方便的方法,可以很容易地做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-12-29
    相关资源
    最近更新 更多