0

我是 MagicalRecord 的新手,所以这可能是一件简单的事情,但我到处寻找答案,似乎没有人遇到我的问题。我有一个简单的核心数据结构,其中一个 Parent 导致多个 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];

我生成了属于一个父母的所有孩子的表格视图,这又可以正常工作。单击一行会将您带到一个控制器,该控制器显示所选孩子的详细信息。这个控制器有两个从表传递给它的属性:表所属的父级和被单击的子级。

然后,我有一个保存按钮,用于对细节所做的任何更改。它触发以下内容:

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 中设置关系,但我已经没有东西可以尝试了......

编辑:这是核心数据设置。我试图在上面简化它,但基本上 Patient 是 Parent,Check 是 Child(患者 = parent,checks = children)。

核心数据设置

此外,在应用程序委托中,它是通过

[MagicalRecord setupCoreDataStack];

此外,如果我在详细视图中使用 NSLog self.child 或 self.parent,两者看起来都像是正确的对象。

4

2 回答 2

0

正如在试图使问题易于管理时经常发生的那样,它看起来与我发布的代码无关。当从父表视图移动到父详细视图然后是子表视图时,我使用以下谓词来获取子列表

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY parent.id like %@", self.parent.id];

这是导致问题的 ANY 。

于 2013-05-10T19:03:41.293 回答
0

您很可能保存了错误的上下文。ContextForCurrentThread: 现在已弃用,因为它并不总是返回正确的上下文。当您保存错误的上下文时,您的保存可能看起来不起作用。我建议通过使用 inContext: 参数明确您在对象创建中使用的上下文,然后他们使用 mr_save 方法保存该上下文

于 2013-05-10T01:18:41.403 回答