2009-12-07 8 views
6

Estoy tratando de usar setPropertiesToFetch en mi solicitud de búsqueda para limitar los datos que se recuperan de mi tienda, pero parece no tener ningún efecto. Cuando lo uso y visualizo el objeto devuelto a la consola, puedo ver que todas mis propiedades están allí. Se muestran los mismos datos si establezco las propiedades o no. Todas las relaciones se muestran como fallas, pero todos los datos para los atributos están ahí.setPropertiesToFetch no parece tener ningún efecto

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context]; 
NSDictionary *entityProperties = [entity propertiesByName]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setFetchBatchSize:20]; 
[fetchRequest setIncludesPendingChanges:NO]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"myAttrib"], nil]]; 

La búsqueda parece devolver los mismos datos por objeto con o sin esa última línea. ¿Algunas ideas?

Respuesta

2

La impresión que tuve (de acuerdo con lo que dijeron los ingenieros de Apple) fue que los datos serían interceptados por las propiedades no recuperadas tan pronto como utilizara los accesorios para esa propiedad. Puede ser que al generar la descripción del objeto NSManagedObject, estos accesores se estén utilizando para cada propiedad, lo que hace que los datos entren en error justo antes de que se genere la cadena que describe los objetos.

Puede intentar usar los fallos de datos del núcleo y/o la memoria caché de datos centrales. No encuentra los instrumentos (en el simulador) para ver cuándo se producen realmente las fallas. Si ocurren justo antes de imprimir los objetos administrados, eso parece apoyar mi suposición anterior.

+0

Sí, realmente lo había pensado. Pero a medida que se mostraban las fallas de relación, pensé que la descripción mostraría fallas de atributos. ¡Interesante, echaré un vistazo a eso! ¡Gracias! –

+0

Tengo una pregunta rápida. Por alguna razón, no permite-muchas relaciones, solo atributos y 1-1 relaciones. ¿Es esto correcto o estoy alcanzando algún tipo de error? Obtengo: 'Inválido para muchas relaciones ... pasado a setPropertiesToFetch:' –

+0

De la documentación en -setPropertiesToFetch: "Las descripciones de propiedad pueden representar atributos, relaciones de uno a uno o expresiones." Creo que para muchas relaciones, recomiendan usar -setRelationshipKeyPathsForPrefetching: –

8

La sección Consideraciones especiales de la documentación para setPropertiesToFetch: dice

Este valor sólo se utiliza si se establece en resultType NSDictionaryResultType.

Su fragmento de código no establece el tipo de resultado. Quizás quisiste usar setRelationshipKeyPathsForPrefetching :?

+0

ahora puede usarlo para objetos – malhal

0

tratar setReturnsDistinctResults: SÍ

a partir de los documentos de manzana:

setReturnsDistinctResults:

Establece si la solicitud debe devolver sólo valores únicos para los campos especificados por propertiesToFetch.

  • (void) setReturnsDistinctResults: (BOOL) Los valores

Parámetros valores En caso afirmativo, la solicitud sólo devuelve los valores distintos para los campos especificados por propertiesToFetch.

-1

La forma correcta de utilizar setPropertiesToFetch

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setResultType:NSDictionaryResultType]; // Remember to setResultType 
[fetchRequest setPropertiesToFetch: 
[NSArray arrayWithObjects:@"name", @"age", nil]]; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest 
                   error:nil]; 

NSArray *nameArray = [results valueForKey:@"name"]; 
NSArray *ageArray = [results valueForKey:@"age"]; 

resultados no es una matriz de persona objetos, pero una serie de Diccionario. Puede acceder a los Diccionarios dentro como esto

NSLog(@"%@", [results[0] valueForKey:@"name"]); 
NSLog(@"%@", [results[0] valueForKey:@"age"]); 

Si sólo desea trabajar con objeto de Model (que CoreData recupera todas las propiedades/attribues de la entidad), usted puede diseñar su modelo con la persona y PersonDetail (que contiene los detalles información sobre una persona).De esta manera

  • Usted puede realizar y obtener fetchRequest un conjunto de objetos Person
  • Al acceder aPerson.detail (detalle es una relación uno-a-uno con PersonDetail) llevará a cabo CoreData fallas para usted
Cuestiones relacionadas