2010-02-09 13 views
10

¿Existe una manera fácil/genérica de comparar dos objetos para ver si son iguales? Por "igual" me refiero al nombre de la entidad idéntica, todos los atributos y las relaciones son iguales, pero la identificación del objeto interno es diferente.Comparación de objetos de datos centrales

De manera similar, ¿hay una manera fácil/genérica de encontrar las diferencias?

Respuesta

10

¿Necesita recursivamente incluir igualdad de relaciones (es decir, las relaciones apuntan a destinos que son iguales según su definición)? ¿Necesita probar la igualdad entre los modelos de objetos administrados? ¿Necesita probar valores no confirmados? Suponiendo que la respuesta es "no" a todo esto, la solución no es demasiado difícil ...

instance1 es igual a instance2 por su definición si:

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

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

Si la respuesta a cualquiera de las anteriores las preguntas son "sí", la solución es significativamente más compleja.

Advertencia

No estoy seguro de nada de esto es una buena idea. Es probable que desee volver a pensar su diseño si necesita utilizar la solución anterior. Es casi seguro que hay mejores formas de hacer lo que intenta hacer que no corren el riesgo de interferir con las intenciones de Core Data.

+0

Si bien esta es una solución sólida, estoy más de acuerdo con su advertencia. Si tiene que comparar cada valor en un objeto con otro para ver si está duplicando datos, entonces hay algo mal en el diseño y necesita volver a pensarlo. –

5

Es posible que desee leer a través de este artículo:

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

NSManagedObject tiene un método isEqual: la que no se le permite anular. ¿Has probado con este método para comprobar si regresa para diferentes tipos de objetos? Varias clases anulan este método (NSObject) de modo que "igual" significa "los mismos objetos" u "objetos con el mismo contenido".

Cuestiones relacionadas