2010-05-07 33 views
14

Así que en mirar a través de Core Data Snippets, me encontré con el siguiente código:¿Cómo recuperar valores distintos en Core Data?

... 
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctValues:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"<#Attribute name#>"]]; 

// Execute the fetch 
NSError *error; 
id requestedValue = nil; // WTF? This isn't defined or used anywhere 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    // handle the error 
} 

Esto es grande y parece perfecta para lo que necesito ... Pero, ¿cómo se utiliza realmente? Supongo que, como devuelve diccionarios, necesito una clave para obtener los valores, pero ¿dónde está definida la clave? ¿Es esa la línea "id requestedValue = nil"? Si es así, ¿cómo se convierte "requestedValue" en la clave? Xcode me da una advertencia del compilador sobre una variable no utilizada en la declaración "requestedValue". Siento que me falta algo aquí.

Gracias de antemano por cualquier ayuda que pueda ofrecer.

Respuesta

28

requestedValue no es nada y, obviamente, no se está utilizando (tal vez fue parte de algún otro ejemplo que se cortó & pegar en este código de ejemplo, quién sabe). Puedes simplemente ignorarlo.

Las claves del diccionario son las mismas que los atributos que ha obtenido y que están definidos en su modelo. Entonces, por ejemplo, si tuviera una entidad de persona con tres atributos definidos, nombre, edad, número de teléfono y solo pidió el nombre, esas serían las únicas claves con datos en sus diccionarios. Por lo tanto:

[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType]; 
[request setReturnsDistinctResults:YES]; 
[request setPropertiesToFetch:[NSArray arrayWithObject:@"name"]]; 

// Execute the fetch 
NSError *error; 
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    abort(); 
} 
for(NSDictionary* obj in objects) { 
    NSLog(@"Person: %@", [obj objectForKey:@"name"]); 
} 
// ... 

lo tanto, si usted tiene 5 personas en su almacén de datos llamado Bob, Sally, Joe, Freida y Sue, que se vería esos nombres se impriman. Si desea usar cualquiera de los otros atributos (como su edad), deberá agregarlo a la matriz que configuró en setPropertiesToFetch:.

En la mayoría de los casos, probablemente sea mejor simplemente recuperar el objeto administrado. El objeto tendrá una falla, por lo que ni siquiera traerá atributos a la memoria a menos que realmente acceda a ellos. Además, si desea realizar cambios en los objetos, puede y persistir en la tienda (con objetos administrados).

+1

Perfecto - gracias por la ayuda. Los fragmentos de datos centrales son realmente útiles, pero dejan un poco a la imaginación si eres un usuario nuevo. ¡Gracias por la ayuda! – Andy

+4

¿un "pequeño" para la imaginación? Dejan TODO a la imaginación. Siento la necesidad de pegarme cada vez que mi única fuente de conocimiento son los documentos escritos por Apple. Afortunadamente, hay StackOverflow con muchos profesionales asesinos como Jason Coco y otros que nos ayudan a comprender los vagos mensajes criptográficos escritos por Apple en sus documentos. Apple fabrica excelentes productos, pero sus documentos suman infinito al cuadrado + 1. – SpaceDog

+2

Parece que setReturnsDistinctValues ​​cambió a setReturnsDistinctResults – mishod