警告:这是我的第一个iPhone应用程序,我是Objective C的新手,因此我的问题可能非常基础。
其实我有一个概念性的问题:
我的NSObject
Project
WorkTime
和Project<-->>WorkTime
(WorkTime
)之间存在一对多关系。 startDate
具有endDate
,project
等属性,以及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。当我开始使用这种方法时,这是我的错误。
答案 0 :(得分:0)
我不明白为什么你使用两种不同的上下文。
这样做的方法是将tableView的上下文传递给addWorkTimeDetail
,并将任何新的WorkTime
添加到该上下文中。如果用户取消,即不创建新对象,则返回时列表中不会有新内容。如果用户在传递的上下文中创建新的WorkTime,则在您返回时它将显示在列表中。
在您的示例中,仅使用一个上下文,并将其传递给您的子视图。
答案 1 :(得分:0)
我发现此链接证明非常有用:
http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/
很好地解释了为什么使用两个上下文有时候是个好主意。我在使用我的问题的UPDATE部分中解释的一个上下文时遇到了一些问题。
现在我正在使用两个上下文,即使有关系,它也能完美运行。重要的是在创建关系时使用第二个上下文的NSManagedObjects。当我开始使用这种方法时,这是我的错误。