核心数据对象比较

Posted

技术标签:

【中文标题】核心数据对象比较【英文标题】:Core data object comparison 【发布时间】:2010-02-09 03:43:14 【问题描述】:

是否有一种简单/通用的方法来比较两个对象以查看它们是否相同? “相同”是指相同的实体名称,所有属性和关系都相同,但内部对象 ID 不同。

同样,是否有一种简单/通用的方法来找出差异?

【问题讨论】:

【参考方案1】:

您是否需要递归地包含关系的相等性(即关系指向您定义的相等的目的地)?您是否需要跨托管对象模型测试相等性?你需要测试未提交的值吗?假设所有这些的答案都是“否”,那么解决方案并不难......

instance1 等于 instance2 根据您的定义,如果:

NSArray *allAttributeKeys = [[[instance1 entity] attributesByName] allKeys];

if([[instance1 entity] isEqual:[instance2 entity]]
&& [[instance1 committedValuesForKeys:allAttributeKeys] isEqual:[instance2 committedValuesForKeys:allAttributeKeys]]) 
  // instance1 "==" instance2

如果上述任何问题的答案是“是”,则解决方案要复杂得多。

警告

我不确定这是否是个好主意。如果您需要使用上述解决方案,您可能需要重新考虑您的设计。几乎可以肯定,有更好的方法来做你想做的事情,而不会冒着违背 Core Data 意图的风险。

【讨论】:

虽然这是一个可靠的解决方案,但我非常同意您的警告。如果您必须将一个对象中的每个值与另一个对象进行比较,以查看您是否在复制数据,那么设计中存在问题,您需要重新考虑。【参考方案2】:

您可能想通读这篇文章:

http://moottoot.blogspot.com/2008/02/core-data-and-uniqueness.html

NSManagedObject 有一个方法isEqual:,你不能覆盖它。您是否尝试过使用此方法检查它是否返回不同类型的对象?各种类会覆盖这个 (NSObject) 方法,因此“相等”表示“相同的对象”或“具有相同内容的对象”。

【讨论】:

以上是关于核心数据对象比较的主要内容,如果未能解决你的问题,请参考以下文章

如何快速比较核心数据中同一实体的两个属性值

Python核心对象的比较拷贝

比较 Objective-C 中的 2 个对象

使用LINQLambda 表达式 委托快速比较两个集合,找出需要新增修改删除的对象

RestKit 在映射或实际插入 CoreData DB 之前比较本地对象和远程对象

python内置类型---第二天笔记