2010-02-09 14 views
10

Esiste un modo semplice/generico per confrontare due oggetti per vedere se sono uguali? Con 'stesso' intendo il nome dell'entità identica, tutti gli attributi e le relazioni sono uguali, ma l'ID dell'oggetto interno è diverso.Confronto dell'oggetto dati di base

Analogamente, esiste un modo facile/generico per trovare le differenze?

risposta

10

È necessario ricorsivamente includere l'uguaglianza delle relazioni (ad esempio, le relazioni puntano a destinazioni uguali alla definizione)? È necessario testare l'uguaglianza tra i modelli di oggetti gestiti? Hai bisogno di testare valori senza risposta? Supponendo che la risposta è "no" a tutto questo, la soluzione non è troppo difficile ...

instance1 è pari a instance2 dalla vostra definizione se:

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

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

Se la risposta a una di queste le domande sono "sì", la soluzione è significativamente più complessa.

Caveat

Non sono sicuro che niente di tutto questo è una buona idea. Probabilmente vorresti ripensare il tuo design se hai bisogno di usare la soluzione di cui sopra. Ci sono quasi certamente modi migliori per fare ciò che stai cercando di fare che non rischiano di incappare nelle intenzioni di Core Data.

+0

Mentre questa è una soluzione solida, sono assolutamente d'accordo con il tuo avvertimento. Se devi confrontare ogni valore di un oggetto con un altro per vedere se stai duplicando i dati, allora c'è qualcosa di sbagliato nel progetto e devi ripensarlo. –

5

Si potrebbe desiderare di leggere questo articolo:

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

NSManagedObject ha un metodo isEqual: che non ti è permesso di ignorare. Hai provato a utilizzare questo metodo per verificare se ritorna per diversi tipi di oggetti? Varie classi sovrascrivono questo metodo (NSObject) in modo che "uguale" significhi "gli stessi oggetti" o "gli oggetti con lo stesso contenuto".

Problemi correlati