MagicalRecords:无法保存简单的关系

时间:2013-05-10 00:36:03

标签: ios objective-c cocoa core-data magicalrecord

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

编辑:这是核心数据设置。我试图在上面简化它,但基本上患者是父母,而检查是儿童(患者=父母和支票=儿童)。

Core data setup

此外,在app delegate中,它是init via

[MagicalRecord setupCoreDataStack];

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

导致这个问题的是ANY。