Tengo una NSFetchRequest que es la devolución de las propiedades de los objetos en un NSDictionaryResultType. Es posible también obtener los objetos ObjectId dentro de este diccionario? De lo contrario será necesario ejecutar la consulta con un tipo de retorno de NSManagedObjectResultType que es mucho más lento para un gran número de artículos devueltos.

InformationsquelleAutor Jason | 2010-10-18

4 Comentarios

  1. 78

    Sí puede, usando el muy ingenioso pero mal documentado NSExpressionDescription clase. Usted necesita agregar correctamente configurado NSExpressionDescription objeto a la matriz de NSPropertyDescription objetos que se establece 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 un @"objectID" clave en los diccionarios de que usted regrese de su recuperación solicitud.

    • Agradable encontrar a Nick, y documentar el ejemplo era muy apreciada.
    • Esto es una maldita respuesta del año 🙂
  2. 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 su obtienen resultados ya están en una matriz por qué no tirar de ellos con el valueForKey:@»objectID» ? Limpio, sencillo, sólo necesita una recuperación solicitud para que pueda tirar de todos los demás datos que usted necesita así.

    • Jason quiere resultados en formato de diccionario, mientras que su enfoque devuelve un fallo objeto administrado
  3. 0

    La única solución que he encontrado hasta ahora es la ejecución de un segundo de recuperación solicitud, que es similar a la inicial de búsqueda solicitud, excepto en los 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 recuperación solicitud para devolver un array con un objeto exactamente, la quería objectID. El rendimiento parece buena, incluso cuando la recuperación inicial de la solicitud de resultado contiene 10000 objetos.

    Si hay alguna forma mejor para manejar esto, yo estaría encantado si alguien podría publicar aquí.

  4. 0

    Nick Hutchinson respuesta en Swift:

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

    Que no puedo comentar porque no tengo suficiente rep 🙁

Dejar respuesta

Please enter your comment!
Please enter your name here