两种不同托管对象上下文中的核心数据关系

时间:2011-07-01 18:41:50

标签: iphone objective-c core-data

警告:这是我的第一个iPhone应用程序,我是Objective C的新手,因此我的问题可能非常基础。

其实我有一个概念性的问题:

我的NSObject Project WorkTimeProject<-->>WorkTimeWorkTime)之间存在一对多关系。 startDate具有endDateproject等属性,以及Project对象的UITableViewController关系。

在显示WorkTime列表的FetchedResultsController子类中,我使用WorkTime获取CoreData模型。当我创建一个新的{{1}}时,我使用第二个上下文并将其与“default”合并一次,一旦用户点击了下钻视图中的“save”,就像在Apple的CoreDataBooks示例中一样文档。这很好用。

当我设置关系时问题就开始了。由于项目处于“默认”上下文中,因此我无法将任何项目对象分配给WorkTime中的项目键,因为它们位于两个不同的上下文中。

那么,我应该将所有项目复制到“保存”环境中吗?或者我应该只为一切使用一个上下文?

当我只使用一个上下文时出现的一个问题是,当用户点击addbutton(insertNewObjectForEntityForName)时,显示WorkTimes的tableview会被实现。因此,列表在modalviewcontroller中呈现新视图控制器(addWorkTimeDetail)之前就会增长。如果用户在该详细视图中单击取消并决定不保存WorkTime,则必须从上下文中删除新创建的实体。我不认为这听起来像这样。

建议非常感谢!

更新

我还有一些问题:

当从RootViewController创建AddWorkTimeViewController时,我创建了一个新的NSObject WorkTime。当用户单击“取消”时,我删除新创建的WorkTime并返回到RootViewController。 FetchedResultsController实现了tableView,我看到了一个简短的动画,因为该对象已被删除。这看起来不太好。

我知道如果用户单击“保存”并且“取消”不执行任何操作,最好只创建对象,但我需要该对象以使用值填充向下钻取视图。下钻视图适用于NSManagedObject。我认为有两种方法可以解决这个问题:

1)从NSObject创建一个临时对象TempWorkTime,其具有与WorkTime NSManagedObject相同的属性。我将在AddWorkTimeViewController中创建TempWorkTime并将其用于向下钻取视图。我当然必须将它们子类化为接受NSObject而不是NSManagedObject。我猜类型转换不起作用。当用户单击“保存”时,我将创建一个WorkTime NSManagedObject并将其传递给TempWorkTime中的值。

2)是否可以欺骗FetchedResultsController,以便在tableView不可见时它不会自动更新?在这种情况下,它不会响应上下文中的更改,直到它回到视图中,因此它不会执行删除动画。

有什么建议吗?

第二次更新 - 也许它对尝试做同样事情的人有用

我发现此链接证明非常有用:

http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/

很好地解释了为什么使用两个上下文有时候是个好主意。我在使用我的问题的UPDATE部分中解释的一个上下文时遇到了一些问题。

现在我正在使用两个上下文,即使有关系,它也能完美运行。重要的是在创建关系时使用第二个上下文的NSManagedObjects。当我开始使用这种方法时,这是我的错误。

2 个答案:

答案 0 :(得分:0)

我不明白为什么你使用两种不同的上下文。

这样做的方法是将tableView的上下文传递给addWorkTimeDetail,并将任何新的WorkTime添加到该上下文中。如果用户取消,即不创建新对象,则返回时列表中不会有新内容。如果用户在传递的上下文中创建新的WorkTime,则在您返回时它将显示在列表中。

在您的示例中,仅使用一个上下文,并将其传递给您的子视图。

答案 1 :(得分:0)

我发现此链接证明非常有用:

http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/

很好地解释了为什么使用两个上下文有时候是个好主意。我在使用我的问题的UPDATE部分中解释的一个上下文时遇到了一些问题。

现在我正在使用两个上下文,即使有关系,它也能完美运行。重要的是在创建关系时使用第二个上下文的NSManagedObjects。当我开始使用这种方法时,这是我的错误。