iphone - query - tutorial core data
Datos principales, ¿cómo obtener el ID de objeto de NSManagedObject cuando NSFetchRequest devuelve NSDictionaryResultType? (4)
La única solución que he encontrado hasta ahora es ejecutar una segunda solicitud de recuperación, que es similar a la solicitud de recuperación inicial, 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 devuelva 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 alegraría que alguien pudiera publicarlos aquí.
Tengo una 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 NSManagedObjectResultType
de NSManagedObjectResultType
que es mucho más lento para una gran cantidad de elementos devueltos.
La respuesta de Nick Hutchinson en Swift:
let idDescription = NSExpressionDescription()
idDescription.name = "objectID"
idDescription.expression = NSExpression.expressionForEvaluatedObject()
idDescription.expressionResultType = .objectIDAttributeType
No puedo comentar sobre eso porque no tengo suficientes representantes :(
Sí, puedes, usando la muy ingeniosa pero mal documentada clase NSExpressionDescription
. NSExpressionDescription
agregar un objeto NSExpressionDescription
correctamente configurado a la matriz de objetos NSPropertyDescription
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];
Debería tener una clave @"objectID"
en los diccionarios que obtiene de su solicitud de búsqueda.
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"]);
Como los resultados obtenidos ya están en una matriz, ¿por qué no los saca con el valor valueForKey: @ "objectID"? Limpio, simple, solo necesita una solicitud de obtención para que pueda obtener todos los demás datos que necesita también.