回滚不适用于可转换的Core Date实体

时间:2013-01-22 06:36:20

标签: ios core-data

我有一个应用程序,它将数据存储在Core Data Managed Objects中。这些对象包含几个属性 - 信息为NSString,布尔值为NSNumber,数据数组为Transformable。

dataPoint.h:

@property (nonatomic, retain) id dataArray;
@property (nonatomic, retain) NSString * note;
@property (nonatomic, retain) NSNumber * bool;

dataPoint.m:

@dynamic dataArray;
@dynamic note;
@dynamic bool;

应用程序用户可以进行更改并存储或取消它们。要撤消所有更改,我调用[managedObjectContest rollback]方法。我还没有设置额外的undoManager。 对于简单的数据类型(如NSString或NSNumber),这很好。调用回滚后,所有条目都处于上次保存状态。但这似乎不适用于存储的数组。调用回滚后,我仍然只获得更改的值。只有在我重新启动应用程序后,才会显示原始(上次保存的)数据。

如何使回滚适用于复杂数据?

谢谢你,亲切的问候!

1 个答案:

答案 0 :(得分:0)

您可以在回滚后重新获取实体。这样,来自持久存储的数据(可能是正确的数据)将替换更改的数组。

另一种方法是保留旧数组的副本,并在显示数据时使用它,如果可行的话(可能不在多个视图控制器之间)。

作为属性的数组是在NSManagedObjects中存储事物的一种非标准方式。这种现象的发生是因为一旦你检索到数组,你基本上会得到一个指向它的指针。您更改了数组,但指针保持不变。在回滚期间,不需要更改任何内容,因此Core Data不执行任何操作。内存中的数组与Core Data无关。

如果您在Core Data中解决问题并对数组中的内容进行建模,那会好得多。除了具有更可靠的数据结构之外,它还可能产生更明确,可读和可维护的代码。