0

原来的问题已经回答了。更新解决了评论中提出的相关问题。

原帖:

我正在使用 Apple 的CoreDataBooks中使用的 MOC 保存方法。但是,我似乎使用了两层 MOC 合并(三个 MOC,其中第三层与第二层合并,然后第二层与第一层合并)。

首先,我有一个列出学校课程的表格视图(ClassList)。选择一个类会推送一个 2 行表视图 (AddClass)。在 AddClass 中,第一行允许用户编辑类标题。选择第二行会推送一个 tableview (ClassRoster),它显示该班级的学生名单。最后,选择一个学生会推送另一个 2 行表格视图 (AddStudent),用户可以在其中编辑学生姓名和用户名。

我可以通过使用双重 MOC 合并方法(CoreDataBooks 使用的 managedObjectContext 和addingManagedObjectContext)成功地添加和保存类。我将在我的第一个视图中将“基本 MOC”称为“MOC1”并将“暂存器”MOC 称为“MOC2”。

MOC2 临时存储对类对象所做的更改。然后可以保存或取消这些更改,将 a 发送-didFinishWithSave:(BOOL)给委托人。如果我保存,在 MOC2 中所做的更改将与 MOC1 合并。该合并运行良好。

处理对学生对象所做的更改是我出错的地方。我想我可以使用 MOC3 作为暂存器来更改将与 MOC2 合并的学生对象(当我保存一个学生对象时)。当我保存类对象时,MOC2 可以反过来与 MOC1 一起保存。

但是我在保存 MOC3 并将学生对象添加到类对象时遇到了错误,因为它们位于不同的上下文中。我可以发布代码,但首先我想问一个更大的问题:我是不是走错了路?

更新:

Zarra 先生建议使用initWithEntity:insertIntoManagedObjectContext:MOC 并将其设置为 nil,从而创建一个临时对象,稍后可以设置并保存其 MOC。

按照他的建议,我正在尝试合并以下代码:

    NSManagedObjectModel *managedObjectModel - [[managedObjectContext persistentStoreCoordinator] managedObjectModel];
    NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"MyClass"];
    MyClass *newClass = [[MyClass alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

我遇到了一个错误,但我不确定它是否与此代码有关。我将调试并发布我发现的内容。

4

1 回答 1

1

是的。您不需要使用多个NSManagedObjectContext. 这个例子是一个非常糟糕的例子。在您的情况下,您应该使用单个上下文,这将消除您的所有问题。

如果您想要一个临时实体,请使用 nil 创建它NSManagedObjectContext。当你想保存它时,你调用-setManagedObjectContext:然后保存它NSManagedObjectContext

您真正想要使用多个线程的唯一时间NSManagedObjectContext是在多线程情况下。

于 2010-08-10T21:58:43.000 回答