【问题标题】:Comparing the attribute contents of two managed objects?比较两个托管对象的属性内容?
【发布时间】:2012-11-26 18:42:03
【问题描述】:

我正在根据我离开网络的数据设置一个 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] 进行比较,还是需要逐个检查每个属性以确定完全匹配?

【问题讨论】:

  • 您是否为每件商品设置了某种唯一标识符?这是经常使用的策略。请注意,如果没有一些唯一标识符,您将无法拥有两只同名和同龄的猫作为不同的猫(这在现实世界中当然是可能的)。

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


【解决方案1】:

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

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

对象 X 的一个非常简单的哈希码实现是这样的:

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

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

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

【讨论】:

  • 感谢您抽出宝贵时间回答 Alex,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多