2010-07-15 28 views
5

tengo este código:¿Cómo obtener el ID de un objeto guardado en el contexto de objetos gestionados de Core Data?

NSEntityDescription *userEntity = [[[engine managedObjectModel] entitiesByName] objectForKey:@"User"]; 
User *user = [[User alloc] initWithEntity:userEntity insertIntoManagedObjectContext:[engine managedObjectContext]]; 

y quiero saber el id del objeto insertado en el contexto de objeto gestionado. ¿Cómo puedo obtener eso?

¿Qué ID seguirá siendo el mismo para la vida útil de ese objeto o persistirá en la base de datos sqlLite debajo de esto y será algo que se puede utilizar para identificarlo de forma exclusiva durante una operación de recuperación (mi objetivo final).

Cualquier ayuda apreciada :) //

Respuesta

10

Si desea guardar el ID de un objeto de forma permanente es necesario:

  1. guardar el objeto en el contexto de manera que los cambios de identificación de un temporal a una identificación permanente.
  2. Extraiga la versión de URI de la ID permanente con -[NSManagedObjectID URIRepresentation]. Eso devuelve un NSURL que puede almacenar como atributo transformable en otro objeto administrado.
  3. Puede obtener el objeto utilizando -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] para generar un nuevo objeto NSManagedObjectID y luego usar -[NSManagedObjectContext objectWithID:] para obtener el objeto gestionado al que se hace referencia.

Se supone que el URI identifica un objeto particular en una tienda en particular en una computadora en particular, pero puede cambiar si realiza cambios estructurales en la tienda como migrarla a una nueva versión de modelo.

Sin embargo, probablemente no necesite hacer nada de esto. Los ObjectID desempeñan un papel mucho más pequeño en Core Data que en otros sistemas de modelos de datos. Core Data mantiene un gráfico de objetos que identifica de manera única los objetos por su ubicación en el gráfico. Simplemente caminar las relaciones gráficas lo lleva a un objeto único específico.

La única vez que realmente necesita ObjectID es cuando está accediendo a objetos en dos o más tiendas persistentes. Los necesita entonces porque las relaciones no cruzan las tiendas.

+0

¡Gracias, respuesta impresionante! :) – Spanky

2

Lea sobre "ID de objeto gestionado" en el Core Data Programming Guide

Puede obtener el identificador de objeto del objeto con algo como:

NSManagedObjectID *moID = [managedObject objectID]; 
+1

fyi, el ID de objeto es temporal hasta que la tienda persistente lo otorgue de forma permanente. – ninjaneer

0

Primero, estás construyendo tus objetos de una manera no preferida. En general, usted debe:

User *user = [NSEntityDescription insertEntityForName:@"User" intoManagedObjectContext:[engine managedObjectContext]]; 

En segundo lugar, cuando se crea el objeto que va a obtener una identificación temporal que se puede acceder a través de [usuario IDobjeto] como David mencionó. Una vez que guarde el contexto, obtendrá una nueva identificación "permanente".

Sin embargo, esta identificación puede cambiar y cambia durante la vida de la entidad (aunque no la instancia). Cosas como migrar los datos pueden hacer que esta identificación cambie. Sin embargo, entre guardar el contexto y salir de la aplicación, la identificación seguirá siendo la misma.

Cuestiones relacionadas