Core data 保存循环删除多对多CoreData关系的一端

Core data 保存循环删除多对多CoreData关系的一端,core-data,Core Data,我已经看了一段时间了,但似乎无法破解它。这是我在CoreData中建立的第一个多对多关系,显然我缺少了一些简单的东西 我在屏幕上维护两个不同的核心数据“实体”,这些实体通过多对多关系进行关联。第一个实体以及第一个和第二个实体之间的关系在屏幕的第一个选项卡上进行维护,这似乎工作正常,允许我删除第一个实体实例并添加/删除第一个和第二个实体之间的关系 我的问题在第二个选项卡上,我在其中维护第二个实体。它们的实体显示良好,我可以更新它们的属性,但是,尝试删除它们会导致永无止境的保存循环 我相信我已经通过

我已经看了一段时间了,但似乎无法破解它。这是我在CoreData中建立的第一个多对多关系,显然我缺少了一些简单的东西

我在屏幕上维护两个不同的核心数据“实体”,这些实体通过多对多关系进行关联。第一个实体以及第一个和第二个实体之间的关系在屏幕的第一个选项卡上进行维护,这似乎工作正常,允许我删除第一个实体实例并添加/删除第一个和第二个实体之间的关系

我的问题在第二个选项卡上,我在其中维护第二个实体。它们的实体显示良好,我可以更新它们的属性,但是,尝试删除它们会导致永无止境的保存循环

我相信我已经通过在第二个实体的NSManagedObject类的willSave方法中添加一个NSLog条目来验证了循环

实体显示在NSArray支持的NSTableView中(我没有使用绑定)。 我在两个选项卡之间共享一个managedObjectContext,删除操作很简单(见下文):

希望有人能帮忙

问候


Scott

这里没有太多内容,但请检查您的删除规则

如果在两侧将多对多关系设置为
delete
,则删除一个对象可能会引发一连串的删除,因为删除一个对象会触发删除其所有相关对象,从而删除其所有相关对象,依此类推


如果您自定义了
willSave
willturnitofult
或类似方法,那么您可能也在该代码中引入了一个循环

好吧,结果很简单(这是我的错:)

我应该提到,我使用的数据是使用单独的数据加载脚本加载到生成的SQLite3文件中的(我使用的是来自各种来源的数据)

我添加的一些记录不包含Z_OPT的值,CoreData在删除这些记录时失败(然后反复尝试删除)

一旦我填充了Z_OPT,一切都正常了。 我想从现在起,我将让CoreData管理对数据库的所有更改:)


再次感谢@TechZen和@ImHuntingWabbits的回复。

这里没有太多内容。尝试在错误发生时发布有关您环境的更多信息,如果是无限循环,请使用shark或“sample”命令获取跟踪。作为最后的手段,发布完整的代码。非常感谢您的回复。。。抱歉没有提供详细信息,但我没有从应用程序中看到太多信息,代码(我认为)也很标准。谢谢你的回复。。。关系的双方都被设置为删除规则:null。就在那时,我试着制定“实体2”端的删除规则:没有操作,但没有帮助。添加到willSave的唯一代码是NSLog,它证明了它进入了一个循环,我现在已经删除了这个。我很想给你们提供更多的信息,但我不知道如何获得它。。。我尝试了@ImHuntingWabbits提到的示例命令(也感谢您的评论),但我真的看不出是什么导致了循环。。。发布该文件内容的最佳方式是什么?好的,关于幕后发生的事情的更多信息。。。我使用SQLDebug选项运行我的应用程序,它显示删除正在回滚,然后再次尝试(日志文件日期和时间已删除):CoreData:sql:BEGIN EXCLUSIVE CoreData:sql:delete FROM ZSYMPTOM,其中Z_PK=?Z_OPT=?CoreData:sql:从ZSYMPTOM中选择Z_PK,Z_OPT,其中Z_PK按Z_PK的(9)顺序排列CoreData:annotation:sql执行时间:0.0012s CoreData:sql:rollbacks由于核心数据模式未记录,因此尝试直接生成SQLite存储非常危险。要做到正确是很棘手的,即使你做到了,苹果可能会在没有警告的情况下更改模式。
int currentRow = [[tableView selectedRowIndexes] firstIndex];
NSManagedObject *targetObject = [self.array objectAtIndex:currentRow];
NSError *error = nil;
[managedObjectContext deleteObject:targetObject];
if (![managedObjectContext save:&error]) {
   NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   abort();
}