2011-03-19 70 views
0

我一直在看这一段时间,但似乎无法破解它。它是我在CoreData中建立的第一个多对多关系,显然有一些简单的我缺少...保存循环删除多对多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(); 
} 

希望有人能帮助... ...

问候

斯科特

+0

这里没有太多东西可以继续。尝试在发生错误时发布一些关于您的环境的更多信息,如果它是无限循环使用shark或'sample'命令来获取跟踪。作为最后的手段,请完整发布您的代码。 – ImHuntingWabbits 2011-03-19 19:59:38

回答

0

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

如果双方都设置为delete的多对多关系,则删除一个对象可以引发级联删除,因为删除一个对象会触发删除其所有相关对象,从而删除所有相关对象对象等。

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

+0

非常感谢您的回复......对于细节缺乏道歉,但我从应用程序中看不到太多内容,代码(我认为)非常标准。 – 2011-03-19 22:06:49

+0

感谢您的回复...双方的关系被设置为删除规则:Nullify。就在这时我试图让'实体2'一方删除规则:没有行动,但它没有帮助。添加到willSave中的唯一代码是NSLog,它证明它正在进入循环,现在我已经删除了它。我想提供一些更多的信息给你们,但我不知道如何得到它......我试着@ImHuntingWabbits提到的示例命令(也感谢您的评论),但我不明白是什么导致循环...发布该文件内容的最佳方式是什么? – 2011-03-19 22:22:55

+0

好的,所以关于幕后发生的事情的一些更多信息...我用SQLDebug选项运行我的应用程序,它显示删除正在回滚,然后再次尝试(删除日志文件日期和时间):CoreData:sql: BEGIN EXCLUSIVE CoreData:sql:DELETE FROM ZSYMPTOM WHERE Z_PK =? AND Z_OPT =? (9)ORDER BY Z_PK CoreData:annotation:sql执行时间:0.0012s CoreData:sql:ROLLBACK – 2011-03-19 23:20:24

1

OK,所以它结束了简单的(我的错:)

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

我添加了一些记录,其中没有包含Z_OPT的值,CoreData在删除这些记录时失败(然后重复尝试删除)。

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

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

+1

由于核心数据架构没有记录,所以它是非常危险的尝试直接生成SQLite存储。正确的做法是棘手的,即使你这样做了,苹果也许会在没有警告的情况下更改架构。 – TechZen 2011-03-20 23:31:07