回滚不适用于可转换的核心日期实体

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 提出的第一个问题 -> 不要忘记勾选上面的复选标记。

以上是关于回滚不适用于可转换的核心日期实体的主要内容,如果未能解决你的问题,请参考以下文章

不适用于python中的代码datetime.strptime

从字符串转换日期和/或时间时 C# 转换失败

转换函数不适用于 CLOB 数据类型

隐式类型转换不适用于方法参数?

将十进制转换为二进制的程序不适用于大输出

XSLT 转换不适用于复杂的 XML