¿Cómo obtener el objeto Core Data de un ID de objeto específico?


Puedo obtener fácilmente el ID de un objeto en Core Data usando el siguiente código:

NSManagedObjectID *moID = [managedObject objectID];

Sin embargo, ¿hay alguna manera de sacar un objeto del almacén de datos principal dándole un ID de objeto específico? Sé que puedo hacer esto usando 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 inicie su propia solicitud de búsqueda. Alguna idea?

Author: Demitri, 2011-02-18

2 answers

Quieres:

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

Obtiene el objeto del almacén que tiene ese ID, o nil si no existe.

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

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

...creará un objeto fault con el ObjectId proporcionado, ya sea que dicho objeto realmente exista en el almacén. Si no existe, cualquier cosa que dispare la falla fallará a menos que inserte el objeto primero con insertObject: de NSManagedObjectContext. El único uso que he encontrado para esto es copiar objetos de tienda en tienda mientras preserva objetos.

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

...devolverá el objeto que tiene ese ID, si ha sido obtenido de la tienda por este managedObjectContext. Si alguien sabe para qué es útil este método, por favor comente.)

[eta.: Otra diferencia importante entre el primer método y los otros dos es que existingObjectWithID:error: nunca devuelve un falla; siempre obtiene todo el objeto por ti. Si está tratando de evitar eso (por ejemplo, trabajar con un objeto costoso de obtener con una propiedad big blob), debe ser inteligente con objectWithID: o objectRegisteredForID:, que no activan fallas; o usar una solicitud de recuperación configurada correctamente.]

 198
Author: rgeorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-21 14:11:21

objectWithID: es el método que estás buscando, y es la forma recomendada de hacerlo. objectWithID: utilizará eficientemente el NSManagedObjectContext para extraer el objeto solo tantos niveles como sea necesario - a diferencia de algunos de los otros medios de hacer esto. objectWithID: utilizará correctamente la información en memoria en los contextos padre, el coordinador del almacén persistente y el propio almacén persistente antes de ir al almacenamiento de respaldo.

Esto se trata en profundidad en la sesión WWDC 2012 " Core Data Best Practicar".

 2
Author: quellish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-07 01:20:29