2012-07-19 25 views
10

Necesito obtener un identificador único para un tipo de NSManagedObject que he creado. Debe estar disponible tan pronto como se haya creado el objeto, nunca cambiar y ser completamente único.Identificador único para NSManagedObject

Esto excluye el NSManagedObjectID, ya que esto puede cambiar cuando se guarda el contexto. Creo que el método -hash podría no ser exclusivo si mis objetos tienen las mismas propiedades.

Realmente me gustaría evitar la creación de un campo UUID uniqueIdentifier inútil en la entidad, ya que parece un desperdicio y desordenados. ¿Hay una mejor práctica aceptada aquí?

+0

¿Has considerado un hash salado? – Jim

+2

el 'NSManagedObjectID' cambiará después del ** primer ** guardado del contexto, luego el objeto obtendrá el' NSManagedObjectID' final, y no se cambiará nunca. no debe preocuparse por los ID existentes entonces, ni siquiera eliminó el 'objeto' porque ningún nuevo' objeto' obtendrá el ID anterior. – holex

Respuesta

15

prueba la propiedad URIRepresentation de NSManagedObjectID. esta es una ID muy única para el actual NSManagerObject pero tenga cuidado hasta queNSManagedObjectno se guarde, le da un ID temporal solamente, no es permanente y puede ser diferente. (solo digo porque no sé para qué y cómo desea utilizar el identificador único.)

ACTUALIZACIÓN # 1

este no está un ID único imaginaria solamente, esto es puro URL única para cada individuo NSManagedObject (como cada archivo tiene una URL única), con ellos puede encontrar nuevamente el NSManagedObject original, después de haber perdido su puntero. Sé que es difícil de entender, pero este es el objetivo del NSManagedObjectID y sus propiedades.

(si usted no entiende cómo el CoreData y sus objetos de trabajo, no lo downvote la respuesta. Por favor, lea más documentación en lugar de la downvoting sin sentido.)

ACTUALIZACIÓN # 2

acuerdo con @NickLocking comentario, me gustaría extender la parte en negrita de mi respuesta anterior:

hasta salvar elNSManagedObjectContextpara la nueva y aún no guardadaNSManagedObjectclases tiene una ID única temporal solamente. Obtendrán la identificación única permanente después de que se guarden por primera vez.

+1

La presentación URIR cambia cuando el objeto se guarda por primera vez. –

0

El único identificador único proporcionado automáticamente por CoreData es el ID del objeto, pero como ha notado, cambiará después de haber sido creado inicialmente. Pero antes de ir a dar con otra manera de solucionar este problema, es posible que desee considerar la posibilidad de definir algo como lo siguiente en su clase de objeto gestionado:

- (NSManagedObjectID *)permID { 
    if ([[self objectID] isTemporaryID]) { 
     // Save myself, returning nil if there are errors 
    } 
    return [self objectID]; 
} 

Este enfoque no es perfecto, por cualquier medio, especialmente si necesidad de exponer la identificación permanente antes de que el objeto se encuentre en un estado en el que sea válida y se pueda guardar en la base de datos. Pero le permitirá exponer una identificación permanente de manera consistente, siempre y cuando no la necesite antes de poder guardar el objeto.

+1

El problema con esto es que guardar el objeto en esta instancia significa que otras partes de mi aplicación detectan que se ha creado un nuevo objeto y procesarlo. Esto significa, por ejemplo, que una entrada de tabla vista se crea sin campos establecidos. –

3

Finalmente, he decidido que no hay una buena manera de hacerlo, así que acabo de crear un campo uniqueIdentifier al que aplique un UUID en awakeFromInsert.

Guardar el objeto hace que otras partes de mi aplicación, específicamente NSFetchedResultsControllers, se actualicen antes de que haya terminado con el objeto. Probé brevemente el método getPermanentObjectIds de NSManagedObjectContext: withError: pensando que obtendría los ID de objeto sin guardar el contexto, pero de hecho simplemente guarda el contexto.

Cuestiones relacionadas