0

我正在根据我离开网络的数据设置一个 managedObject,在我将这个新对象添加到 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]需要逐个检查每个属性以确定完全匹配?

4

1 回答 1

1

唯一标识符通常用于通过仅匹配一个字段来搜索对象。正如您所注意到的,在多个字段上进行匹配可能很烦人且效率低下,但它可能并没有您想象的那么糟糕:您可以构造一个NSPredicate非常容易地匹配 Core Data 中对象上所有必需字段的方法。

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

对象 X 的一个非常简单的哈希码实现将类似于:

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

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

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

于 2012-11-27T00:52:03.080 回答