2011-02-17 11 views
111

puedo conseguir fácilmente Identificación de un objeto en la base de datos usando el siguiente código:¿Cómo obtener el objeto de datos básicos desde un ID de objeto específico?

NSManagedObjectID *moID = [managedObject objectID]; 

Sin embargo, hay una manera de conseguir un objeto fuera del almacén de datos central, dándole un ID de objeto específico? Sé que puedo hacer esto mediante el uso de un NSFetchRequest, así:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID]; 
[fetchRequest setPredicate:predicate]; 

Sin embargo, me gustaría hacerlo de una manera que no inicia su propia solicitud de búsqueda. ¿Algunas ideas?

+0

Pero con la solicitud de búsqueda, puede establecer propiedades o relaciones que se precargarán, lo que le dará una excelente eficiencia en lugar de muchas más consultas a medida que acceda a las cosas. – malhal

Respuesta

197

que desee:

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID 
            error:(NSError **)error 

Obtiene el objeto de la tienda que tiene esa identificación, o nil si no existe.

(Tenga en cuenta:. Existen dos métodos en NSManagedObjectContext con nombres similares que parece que me hizo tropezar Para ayudar a mantenerlos recta, esto es lo que hacen los otros dos:

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID 

... creará una objeto fault con el ID de objeto proporcionado, ya sea que ese objeto realmente exista en la tienda. Si no existe, cualquier cosa que dispare la falla fallará a menos que inserte primero el objeto con 0MandardObjectContext insertObject:. El único uso es I ' Como se ha encontrado para esto, se están copiando objetos de una tienda a otra mientras se conservan los ObjectID.

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID 

... devolverá el objeto que tiene esa ID, si ha sido extraído de la tienda por este managedObjectContext. Si alguien sabe para qué sirve este método, coméntelo.)

[eta .: Otra diferencia importante entre el primer método y los otros dos es que existingObjectWithID:error: nunca devuelve un error; siempre busca el objeto completo para ti. Si intenta evitar eso (por ejemplo, trabajar con un objeto costoso de buscar con una gran propiedad blob), debe ser inteligente con objectWithID: o objectRegisteredForID:, que no disparan fallas; o utilice una solicitud de recuperación configurada correctamente.]

+11

'- (NSManagedObject *) objectRegisteredForID: (NSManagedObjectID *) objectID' probablemente sea útil cuando solo desee ver si un objeto ya existe en contexto y no desea recuperarlo. – Tony

+0

Mi situación En '-tableView: didSelectRowAtIndexPath:' UIAlertView con yes/no se muestra. En "sí", hay algo de trabajo con el objeto. Utilizo 'NSFetchedResultsController' + actualizaciones de fondo de CoreData desde remoto. Así que no puedo almacenar objetos: mientras la alerta está en la pantalla, el almacenamiento puede actualizarse y el objeto puede eliminarse. Guardo objectId, luego lo recupero una vez más en alerta delegado. Porque uso 'NSFetchedResultsController' - todos los objetos necesarios ya están en contexto en este momento. Además, cuando no hay un objeto en contexto, CoreData no debería hacer un intento de búsqueda inútil. – kpower

+0

¡buena respuesta, gracias! estos nombres de método son realmente difíciles. es fácil estropear todo con el incorrecto – jackal

2

objectWithID: es el método que está buscando, y es la forma recomendada de hacerlo. objectWithID: utilizará de manera eficiente el NSManagedObjectContext para extraer el objeto solo en tantos niveles como sea necesario, a diferencia de algunos de los otros medios para hacerlo. objectWithID: utilizará correctamente la información en memoria en contextos principales, el coordinador de tienda persistente y la tienda persistente antes de ir al almacenamiento de respaldo.

Esto se trata en profundidad en la sesión WWDC 2012 "Mejores prácticas de datos centrales".

Cuestiones relacionadas