向核心数据添加记录时出现 NSSet 错误(多对多关系)

Posted

技术标签:

【中文标题】向核心数据添加记录时出现 NSSet 错误(多对多关系)【英文标题】:NSSet error when adding record to core data (to-many relationship) 【发布时间】:2012-12-10 10:26:41 【问题描述】:

好的,所以我对 ios 还是很陌生,对一些事情感到困惑。 首先,这是我的实体...

我在数据中已经有了一个水果(苹果)和一个来源(树)。它们都保存在数据库中。

接下来我想添加一个橙色,但与“树”有关系。所以这就是我正在使用的:

    Fruit *fruit = (Fruit *)[NSEntityDescription insertNewObjectForEntityForName:@"Fruit" inManagedObjectContext:managedObjectContext];
    fruit.fruitName = @"Orange";
  NSSet *test = [NSSet setWithObject:fruit];
    [_source addSourceFruit:test];

NSLog(@"4");

fruit.fruitSource = _source;

(_source 是“树”,我对 Source 实体上的“Tree”执行了获取请求到一个数组中,然后将 objectAtIndex:0 (Tree) 分配给指向源实体的点。

   data = [managedObjectContext executeFetchRequest:request error:&error];


   Source *_source = [data objectAtIndex:0];

以及访问器方法:

- (void)addSourceFruitObject:(Fruit *)value;
- (void)removeSourceFruitObject:(Fruit *)value;
- (void)addSourceFruit:(NSSet *)values;
- (void)removeSourceFruit:(NSSet *)values;

我找到了与捆绑包相关的答案,但我并不完全确定它们。 我已经读过这个 'https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html' 和 'https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html' 但我似乎并没有很好地掌握它。

编辑:错误是

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSSet intersectsSet:]: set argument is not an NSSet'
*** First throw call stack:

【问题讨论】:

【参考方案1】:

我相信您通过替换 sourceFruit 集来混淆 Core Data。 Core Data 保持反向关系。这意味着您只需设置fruit.fruitSource = _source; 即可了解对象的连接方式。您可以使用[_source addSourceFruitObject:fruit]; 代替,但这对我来说似乎不太简洁。

(顺便说一句:最好避免使用_name 命名局部变量的风格。将这种形式用于支持属性的实例变量已成为一种标准。)

【讨论】:

好的,所以通过使用 NSSet ( NSSet *test = [NSSet setWithObject:fruit]; [_source addSourceFruit:test]; ) 删除部分,它现在会抛出“问题保存:操作无法” t 完成。 (Cocoa 错误 1570。)' 这意味着某些内容是空白/无,但我不确定是什么。抱歉,伙计,我不知道我是如何登陆这样一个网络的,哈哈! 我无法从我所看到的情况中判断那可能是什么。您可以打印_sourcefruit 的值,而不是记录@"4",以查看那里是否有任何线索。 这...sourceFruit = "0x25fdf0 <x-coredata:///Fruit/t3262FDE7-017D-4904-8384-22958E2E4F062>"; ...是说 sourceFruit 是单个对象而不是集合。我的猜测是您在模型中将关系从“对一”转换为“对多”,但没有重新生成 Fruit/Source .h/.m 文件。 集合与单个对象有些混淆,但我不确定是什么。你能把另一个日志语句放在和前一个大致相同的地方吗:NSLog(@"sourceFruit class: %@", [source.sourceFruit class]); 是的,对不起...我有一个心理障碍,反对使用该下划线。 :-) 好吧,你肯定已经确认了这个问题。如果我在测试项目中做同样的事情,我会得到“sourceFruit class: _NSFaultingMutableSet”。我很想清理项目,并从设备或模拟器中删除应用程序,看看全新的构建/安装是否会改变任何东西。如果没有,我不知道该说什么;问题现在很明显,但原因不明显。

以上是关于向核心数据添加记录时出现 NSSet 错误(多对多关系)的主要内容,如果未能解决你的问题,请参考以下文章

尝试创建多对多关系时出现 MySQL 错误

自跟踪实体 SaveChanges() 在多对多关系中添加实体时出现异常

核心数据,如何从关系集合中删除一个元素(NSSet)

如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet

保持多对多关系时出现 PropertyAccessException

打印多对多实体时出现异常