回滚不适用于可转换的核心日期实体
Posted
技术标签:
【中文标题】回滚不适用于可转换的核心日期实体【英文标题】:rollback is not working for transformable Core Date entities 【发布时间】:2013-01-22 06:36:19 【问题描述】:我有一个应用程序,它将数据存储在 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】:您可以在回滚后简单地重新获取实体。这样,持久存储中的数据(可能是正确的数据)将替换更改后的数组。
如果可行的话,另一种方法是只保留旧数组的副本并使用它来显示数据(可能无法跨多个视图控制器)。
作为属性的数组是在 NSManagedObjects 中存储东西的一种相当非标准的方式。这种现象的发生是因为一旦你检索到数组,你就得到了一个指向它的指针。您更改了数组,但指针保持不变。在回滚期间,无需更改任何内容,因此 Core Data 什么也不做。您在内存中的数组与 Core Data 无关。
如果您不厌其烦地在 Core Data 中为您的数组中的事物建模,那就更好了。除了具有更可靠的数据结构外,它还可能产生更明确、可读和可维护的代码。
【讨论】:
感谢您的回答。我已经尝试在回滚后重新获取实体,但即使这种方法似乎也不起作用 - 我仍然得到了更改后的数组。 所以你应该按照我在上一段中的建议去做。 我更改了我的数据模型(我不再使用可转换对象),现在它可以正常工作了。如果有人找到其他解决方案 - 请随时发布。这会很有趣。 看到这是您向 SOF 提出的第一个问题 -> 不要忘记勾选上面的复选标记。以上是关于回滚不适用于可转换的核心日期实体的主要内容,如果未能解决你的问题,请参考以下文章