0

我有一个应用程序,它将数据存储在核心数据托管对象中。这些对象包含几个属性 - NSString 信息,NSNumber 布尔值和 Transformable 数据数组。

数据点.h:

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

数据点.m:

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

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

我必须做什么才能使回滚对复杂数据起作用?

谢谢你和亲切的问候!

4

1 回答 1

0

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

另一种方法是只保留旧数组的副本并使用它来显示您的数据,如果这是可行的(可能不是跨多个视图控制器)。

数组作为属性是一种在 NSManagedObjects 中存储东西的相当非标准的方式。这种现象的发生是因为一旦你检索到数组,你就得到了一个指向它的指针。您更改了数组,但指针保持不变。在回滚期间,无需更改任何内容,因此 Core Data 什么也不做。您在内存中的数组与 Core Data 无关。

It would be much better if you took the trouble and model the things in your array also in Core Data. It is likely to results in more explicit, readable and maintainable code, in addition to have a more solid data structure.

于 2013-01-22T07:38:03.750 回答