我是MagicalRecord的新手,所以这可能是一件简单的事情,但我到处寻找答案,似乎没有人遇到我的问题。 我有一个简单的核心数据结构,其中一个父节点导致许多Child对象,其中一个是子节点,另一个是父节点。
正如所料,这有效......
Parent *parent = [Parent MR_createEntity];
parent.name = @"John";
Child *child1 = [Child MR_createEntity];
child.name = @"Paul";
parent.children = [NSSet setWithObject:child];
// or child.parent = parent;
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:nil];
我生成一个属于一个父母的所有孩子的表格视图,这再次正常。单击一行将转到显示所选子项详细信息的控制器。该控制器有两个从表传递给它的属性:表所属的Parent和被点击的Child。
然后我有一个保存按钮,用于对细节进行任何更改。它会触发以下内容:
self.child.parent = self.parent;
/* all the other details of the child */
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:nil];
[self.navigationController popViewControllerAnimated:YES];
但我总是收到此错误
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null)
2013-05-09 17:30:17.312 NoteMD[37109:c07] __70-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:]_block_invoke21(0x815f750) Unable to perform save: The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.
无论我尝试什么(例如[self.parent addChildObject:self.child]或使用existingObjectWithID获取本地版本的self.parent和self.child),我都会得到相同的错误。
我想我误解了如何在MagicalRecord中设置关系,但我已经没有东西可以尝试......
编辑:这是核心数据设置。我试图在上面简化它,但基本上患者是父母,而检查是儿童(患者=父母和支票=儿童)。
此外,在app delegate中,它是init via
[MagicalRecord setupCoreDataStack];
另外,如果我在详细视图中使用NSLog self.child或self.parent,则两者看起来都是正确的对象。
答案 0 :(得分:0)
您最有可能保存错误的上下文。 ContextForCurrentThread:现在已弃用,因为它并不总是返回正确的上下文。当您保存错误的上下文时,您的保存可能看起来不起作用。我建议使用inContext:参数明确你在对象创建中使用的上下文,并使用mr_save方法保存该上下文
答案 1 :(得分:0)
通常在尝试使问题易于管理时,看起来它与我发布的代码无关。当从父表视图移动到父详细信息视图然后子表视图时,我使用以下谓词来获取子列表
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY parent.id like %@", self.parent.id];
导致这个问题的是ANY。