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
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.
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í.
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.
Jason quiere resultados en el formato del diccionario, mientras que su enfoque devuelve un objeto administrado fallado – unixo
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 :(
- 1. Datos básicos NSFetchRequest setResultType: NSDictionaryResultType no funciona
- 2. Datos principales: Keypath "objectID" no encontrado en la entidad
- 3. Datos principales: Resultado de obtención de múltiples entidades o relación
- 4. iPhone y datos principales: ¿se ha eliminado NSManagedObject?
- 5. Acerca de obtener un nuevo objeto NSManagedObject
- 6. Datos principales: cómo generar CoreDataGeneratedAccessors?
- 7. cómo obtener el objectID de la url?
- 8. Datos principales: Clasificación de NSFetchRequest por recuento de la relación de muchos
- 9. Datos perdidos cuando relanzo la aplicación (Datos principales)
- 10. Sincronización de subproceso de contexto de objeto gestionado Datos principales
- 11. datos básicos: ejecución de interrupción NSFetchRequest
- 12. Datos principales: iteración a través de los atributos de un NSManagedObject
- 13. Objetos gestionados de datos principales con métodos y datos adicionales
- 14. Obtener propiedades de NSManagedObject como NSDictionary
- 15. Datos principales: Obtener todas las entidades
- 16. Core Data devuelve NSManagedObject en lugar de la clase Concrete, pero solo cuando se usa. accesor
- 17. recuperar único objeto de NSFetchRequest
- 18. Datos principales: ¿Query ID de objeto en un predicado?
- 19. Cómo transportar la subclase NSManagedObject entre clases?
- 20. expresión NSDictionaryResultType no tener en cuenta los nuevos objetos insertados
- 21. Cómo convertir cadenas en ObjectId
- 22. Datos básicos NSFetchRequest devuelve matriz sin clasificar después de eliminar el objeto y volver a recopilar los datos
- 23. Cómo establecer ObjectId como un tipo de datos en mongoose
- 24. ¿Cómo obtener el objeto de datos básicos desde un ID de objeto específico?
- 25. Clave primaria de datos principales
- 26. Ordenando datos principales con predicado para eliminar duplicados
- 27. Datos principales en Android
- 28. iPhone - Agregar datos principales al proyecto existente?
- 29. Datos principales: entidad abstracta en la solicitud de obtención
- 30. Datos principales: observe los cambios y registre las notificaciones locales
agradable encontrar a Nick, y su documentar el ejemplo era muy apreciado –
Esta es la respuesta del año :) –