我有一个应用程序,它将数据存储在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),这很好。调用回滚后,所有条目都处于上次保存状态。但这似乎不适用于存储的数组。调用回滚后,我仍然只获得更改的值。只有在我重新启动应用程序后,才会显示原始(上次保存的)数据。
如何使回滚适用于复杂数据?
谢谢你,亲切的问候!
答案 0 :(得分:0)
您可以在回滚后重新获取实体。这样,来自持久存储的数据(可能是正确的数据)将替换更改的数组。
另一种方法是保留旧数组的副本,并在显示数据时使用它,如果可行的话(可能不在多个视图控制器之间)。
作为属性的数组是在NSManagedObjects中存储事物的一种非标准方式。这种现象的发生是因为一旦你检索到数组,你基本上会得到一个指向它的指针。您更改了数组,但指针保持不变。在回滚期间,不需要更改任何内容,因此Core Data不执行任何操作。内存中的数组与Core Data无关。
如果您在Core Data中解决问题并对数组中的内容进行建模,那会好得多。除了具有更可靠的数据结构之外,它还可能产生更明确,可读和可维护的代码。