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

Posted

技术标签:

【中文标题】保存循环删除多对多CoreData关系的一端【英文标题】:Save loop deleting one end of many-to-many CoreData relationship 【发布时间】:2011-03-19 05:49:38 【问题描述】:

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

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

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

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

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

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();

希望有人能帮忙...

问候

斯科特

【问题讨论】:

这里没什么可做的。尝试在错误发生时发布有关您的环境的更多信息,如果它是无限循环使用鲨鱼或“样本”命令来获取跟踪。作为最后的手段,请完整发布您的代码。 【参考方案1】:

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

我应该提到我一直在使用的数据已使用单独的数据加载脚本加载到生成的 SQLite3 文件中(我正在使用来自各种来源的数据)。

我添加的一些记录不包含 Z_OPT 的值,CoreData 在删除这些记录时失败(然后一遍又一遍地重新尝试删除)。

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

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

【讨论】:

由于 Core Data 模式未记录在案,因此尝试直接生成 SQLite 存储非常危险。把它做好是很棘手的,即使你这样做了,Apple 可能会在没有警告的情况下更改架构。【参考方案2】:

这里不多,但请检查您的删除规则。

如果您在双方都将多对多关系设置为delete,则删除一个对象会引发一连串删除,因为删除一个对象会触发删除其所有相关对象,进而删除所有相关对象相关对象等等。

如果您自定义了willSavewillTurnIntoFault 或类似方法,您可能也在该代码中引入了循环。

【讨论】:

非常感谢您的回复...抱歉缺少细节,但我并没有真正从应用程序中看到太多,而且代码(我认为)非常标准。 感谢您的回复...关系的双方都设置为删除规则:无效。就在那时,我尝试制定“实体 2”方删除规则:无操作,但没有帮助。添加到 willSave 的唯一代码是 NSLog,它证明它正在进入一个循环,我现在已经删除了它。我很乐意为你们提供更多信息,但不知道如何获得它...我尝试了@ImHuntingWabbits 提到的示例命令(也感谢您的评论)但我真的看不出是什么导致了循环...发布该文件内容的最佳方式是什么? 好的,所以有关幕后发生的事情的更多信息...我使用 SQLDebug 选项运行了我的应用程序,它显示删除正在回滚然后再次尝试(日志文件日期和时间已删除):CoreData:sql:BEGIN EXCLUSIVE CoreData:sql:DELETE FROM ZSYMPTOM WHERE Z_PK =?和 Z_OPT = ? CoreData: sql: SELECT Z_PK,Z_OPT FROM ZSYMPTOM WHERE Z_PK IN (9) ORDER BY Z_PK CoreData: 注释: sql 执行时间: 0.0012s CoreData: sql: ROLLBACK

以上是关于保存循环删除多对多CoreData关系的一端的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 多对多关系插入和删除操作

在 Swift 中将 NSManagedObject 添加到 CoreData 多对多关系时防止循环

iphone, 以多对多关系保存数据, 核心数据

在“多对多关系”环境中将图片保存在 Core Data 中

删除 NSManagedObject 子类不会取消它的多对多关系

CoreData 多对多关系