2010-08-10 15 views
6

Quiero conseguir un único objeto de mi almacén de datos de Datos Básicos, aquí está el código que he estado usando pero devuelve una matriz de objetos, tiene que haber una manera más sencilla y mejor:recuperar único objeto de NSFetchRequest

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
+0

[request setFetchLimit: 1] puede limitar el número de objetos devueltos, aunque aún obtendrá un NSArray. – magma

Respuesta

8

Si el predicado siempre obtiene más de un resultado:

  • refinar el predicado - no se olvide que usted puede construir predicados con la lógica como Y/O, la igualdad simple es fácil, pero puede no ser suficiente selectiva en Tu caso.

  • sólo tiene que seleccionar el resultado deseado de la matriz, que no es gran cosa - aunque si esto es posible también debería ser posible refinar el predicado ...

  • posibilidad de reorganizar el modelo de datos de manera que se puede refinar el predicado para recuperar solo un elemento.

La búsqueda siempre devuelve una matriz, esa es su definición. Sin embargo, puede ser una matriz de un objeto.

+0

bueno, entonces lo que obtuve funciona perfectamente :) Gracias por la aclaración, mi ManufacturerID siempre será único, así que debería estar todo listo. – Slee

6

Siempre va a devolver una matriz pero puede hacerlo más limpio:

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
//Making a mutable copy here makes no sense. There is never a reason to make this mutable 
//NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
id manufacturer = [[managedObjectContext executeFetchRequest:request error:&error] lastObject]; 
request = nil; 
NSAssert1(error && !manufacturer, @"Error fetching object: %@\n%@", [error localizedDescription], [error userInfo]); 

-lastObject devolverá el último elemento de la matriz o nula si la matriz está vacía. Esto mantiene su código un poco más limpio cuando sabe que va a haber un objeto en la matriz o si no le importa qué objeto extraiga de la matriz.

Por cierto, los nombres de sus propiedades deben comenzar con una minúscula. Me sorprende que el compilador no lo haya advertido al respecto.

+0

así que en lugar de mutableCopy cuando quiero todos los elementos de la matriz, ¿qué debo usar en su lugar? Además, solo utilicé mayúsculas en los nombres de las propiedades de las entidades en mi modelo de datos básicos, de lo contrario uso minúsculas. – Slee

+0

En su código en la pregunta tiene 'ManufacturerID' de ahí mi comentario sobre esa parte :) En cuanto a su otra copia, el' -executeFetchRequest: error: 'devuelve una matriz. No necesitas hacer nada más con eso. Llamar a '-mutableCopy' simplemente lo convierte en un' NSMutableArray' que no hace nada útil cuando se trabaja con un 'NSArray' devuelto por Core Data. Agregar a esa matriz no agregará objetos a los datos principales; eliminar objetos de esa matriz no los eliminará de Core Data. –

0

Probar fetchRequest.fetchLimit = 1. Aún obtienes una matriz, pero con un máximo de 1 objeto.

+0

Intenté 'fetchLimit == 1' para objetos' core data'. Simplemente no funciona –

+0

Funciona perfecto. – user1447414

Cuestiones relacionadas