2010-10-18 16 views
33

Tengo un NSFetchRequest que devuelve las propiedades de los objetos en un NSDictionaryResultType. ¿Es posible obtener también ObjectId de los objetos dentro de este diccionario? De lo contrario, tendré que ejecutar la consulta con un tipo de devolución de NSManagedObjectResultType que es mucho más lento para una gran cantidad de artículos devueltos.Datos principales, cómo obtener ObjectId de NSManagedObject cuando NSFetchRequest devuelve NSDictionaryResultType?

Respuesta

76

Sí, puede, utilizando la muy ingeniosa pero mal documentada NSExpressionDescription clase. Debe agregar un objeto NSExpressionDescription correctamente configurado a la matriz de NSPropertyDescription objetos que estableció a través de setPropertiesToFetch: para su NSFetchRequest.

Por ejemplo:

NSExpressionDescription* objectIdDesc = [[NSExpressionDescription new] autorelease]; 
objectIdDesc.name = @"objectID"; 
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject]; 
objectIdDesc.expressionResultType = NSObjectIDAttributeType; 

myFetchRequest.propertiesToFetch = [NSArray arrayWithObjects:objectIdDesc, anotherPropertyDesc, yetAnotherPropertyDesc, nil]; 
NSArray* fetchResults = [myContext executeFetchRequest:myFetchRequest error:&fetchError]; 

A continuación, debe tener una clave @"objectID" en los diccionarios que regrese de su solicitud de búsqueda.

+2

agradable encontrar a Nick, y su documentar el ejemplo era muy apreciado –

+1

Esta es la respuesta del año :) –

0

La única solución que he encontrado hasta ahora es la ejecución de una segunda petición de recuperación, que es similar a la inicial petición de recuperación excepto las siguientes diferencias:

[fetchRequest setReturnsObjectsAsFaults:YES]; 
[fetchRequest setPropertiesToFetch:nil]; 
[fetchRequest setFetchLimit:1]; 
[fetchRequest setFetchOffset:index]; // The index for which the objectID is needed 
[request setResultType:NSManagedObjectIDResultType]; 

Esto hará que la solicitud de búsqueda para devolver una matriz con exactamente un objeto, el objectID deseado. El rendimiento parece bueno, incluso cuando el resultado de la solicitud de búsqueda inicial contiene 10000 objetos.

Si hay formas mejores de manejar esto, me gustaría que alguien pudiera publicarlas aquí.

4
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    request.entity = [NSEntityDescription entityForName:@"yourEntity" inManagedObjectContext:context]; 
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES], nil]; 
    request.predicate = nil; 
    request.fetchLimit = 20; 

    NSError *error = nil; 
    NSArray fetchedResults = [context executeFetchRequest:request error:&error]; 

    NSLog(@"%@", [fetchedResults valueForKey:@"objectID"]); 

Desde sus resultados inverosímiles ya están en una matriz por qué no sacarlos con el valueForKey: @ "IDobjeto"? Limpio, simple, solo necesita una solicitud de obtención para que pueda obtener todos los demás datos que necesita también.

+1

Jason quiere resultados en el formato del diccionario, mientras que su enfoque devuelve un objeto administrado fallado – unixo

0

respuesta de Nick Hutchinson en Swift:

let idDescription = NSExpressionDescription() 
    idDescription.name = "objectID" 
    idDescription.expression = NSExpression.expressionForEvaluatedObject() 
    idDescription.expressionResultType = .objectIDAttributeType 

no puedo comentar acerca de eso porque no tengo representante suficiente :(

Cuestiones relacionadas