2010-02-09 10 views
10

Gibt es eine einfache/generische Möglichkeit, zwei Objekte zu vergleichen, um zu sehen, ob sie gleich sind? Mit "gleich" meine ich den identischen Entitätsnamen, alle Attribute und Beziehungen sind gleich, aber die interne Objekt-ID ist unterschiedlich.Kerndatenobjekt Vergleich

Gibt es auch eine einfache/generische Möglichkeit, die Unterschiede zu finden?

Antwort

10

Müssen Sie die Gleichheit von Beziehungen rekursiv einbeziehen (d. H. Beziehungen zeigen auf Ziele, die Ihrer Definition entsprechen)? Müssen Sie die Gleichheit zwischen verwalteten Objektmodellen testen? Müssen Sie nicht festgeschriebene Werte testen? „Nein“, um alle diese die Antwort Unter der Annahme ist, ist die Lösung nicht zu hart ...

instance1-instance2 von Ihrer Definition gleich ist, wenn:

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

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

Wenn die Antwort auf eine der oben genannten Fragen sind "Ja", die Lösung ist wesentlich komplexer.

Caveat

bin ich irgendetwas davon nicht sicher eine gute Idee ist. Sie möchten wahrscheinlich Ihr Design überdenken, wenn Sie die obige Lösung verwenden müssen. Es gibt mit ziemlicher Sicherheit bessere Möglichkeiten, das zu tun, was Sie tun, ohne dabei Gefahr zu laufen, mit den Absichten von Core Data zu kollidieren.

+0

Obwohl dies eine solide Lösung ist, stimme ich am besten mit Ihrem Vorbehalt überein. Wenn Sie jeden Wert in einem Objekt mit einem anderen vergleichen müssen, um zu sehen, ob Sie Daten duplizieren, dann stimmt etwas nicht mit dem Design und Sie müssen es neu überdenken. –

5

Sie könnten durch diesen Artikel lesen möchten:

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

NSManagedObject hat eine Methode isEqual:, die es nicht erlaubt ist außer Kraft zu setzen. Haben Sie versucht, diese Methode zu verwenden, um zu prüfen, ob sie für verschiedene Arten von Objekten zurückgegeben wird? Verschiedene Klassen überschreiben diese (NSObject) Methode, so dass "gleich" entweder "die gleichen Objekte" oder "Objekte mit dem gleichen Inhalt" bedeutet.