比较两个托管对象的属性内容?

时间:2012-11-26 18:42:04

标签: iphone objective-c cocoa-touch core-data

我正在从我离开网络的数据中设置一个托管对象,然后我将这个新对象添加到managedObjectContext中,我想检查它是否已准备好在数据库中。有没有办法比较一个匹配中的两个托管对象,或者我是否必须单独比较每个属性以确定它们是相同还是包含差异?

简单示例:

Entity:Pet (Created but not inserted into database)
Attribute, Name: Brian
Attribute, Type: Cat
Attribute, Age: 12

Entity:Pet (Currently in database)
Attribute, Name: Brian
Attribute, Type: Cat
Attribute, Age: 7

在此示例中,我可以将[Brian, Cat, 12][Brian, Cat, 7]进行比较,还是需要逐个查看每个属性以确定完全匹配?

1 个答案:

答案 0 :(得分:1)

唯一标识符通常用于搜索对象,只需匹配一个字段即可。正如您所注意到的,在多个字段上进行匹配可能会令人烦恼且效率低下,但它可能没有您想象的那么糟糕:您可以构造NSPredicate以轻松匹配Core Data中对象上的所有必需字段。

暂时使用NSPredicate:假设您只想匹配一个字段。如果您提供的数据中没有合适的唯一标识符,则可以派生一个。显而易见的方法是根据您要匹配的每个字段为您存储的所有内容构建哈希码。然后,当您希望检查“传入”对象是否已存在于核心数据中时,计算新对象的哈希码,然后只需使用相同的哈希码查找核心数据中的对象。 (注意:如果您发现一个已存在且具有相同哈希码的对象,您可能希望比较所有字段以检查它确实代表同一个对象 - 它很可能是一个'不同'对象,AKA哈希碰撞)。

对象X的一个非常天真的哈希代码实现类似于:

hashcode(X) = hashcode(X.name) + hashcode(X.type) + hashcode(X.age)

要查看编写哈希码函数的更实际示例,请参阅接受的答案here

顺便说一句,我假设您不想立即将核心数据中的所有对象加载到内存中。但是,如果这是可以接受的(假设您的项目数量非常有限),另一种方法是在您的课程上实施isEqualhash,然后使用常规基础类方法,例如NSArray indexOfObject: (或者,更好的是,NSDictionary objectForKey:)找到感兴趣的物体。