2009-12-07 15 views
6

Sto cercando di utilizzare setPropertiesToFetch nella mia richiesta di recupero per limitare i dati che vengono recuperati dal mio negozio, ma sembra non avere alcun effetto. Quando lo uso e visualizzo l'oggetto restituito nella console, posso vedere che ci sono tutte le mie proprietà. Gli stessi dati vengono visualizzati indipendentemente dal fatto che imposti o meno le proprietà. Tutte le relazioni vengono visualizzate come errori, ma tutti i dati relativi agli attributi sono presenti.setPropertiesToFetch non sembra avere alcun effetto

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]]; 

Il recupero sembra restituire gli stessi dati per oggetto con o senza quell'ultima riga. Qualche idea?

risposta

2

L'impressione che ho avuto (da quello che gli ingegneri Apple hanno detto) era che i dati sarebbero stati errati per le proprietà non recuperate non appena si utilizzavano gli accessor per quella proprietà. È possibile che nel generare la descrizione di NSManagedObject, questi accessor vengano utilizzati per ciascuna proprietà, causando l'errore dei dati subito prima che venga generata la stringa che descrive gli oggetti.

Si potrebbe provare a utilizzare gli strumenti Anomalia Dati Dati e/o Core Data Cache Misses (nel simulatore) per vedere quando si verificano effettivamente gli errori. Se accadono proprio prima di stampare gli oggetti gestiti, ciò sembrerebbe supportare la mia ipotesi sopra.

+0

Sì, lo avevo davvero pensato. Ma poiché venivano mostrati i difetti di relazione, pensavo che la descrizione avrebbe mostrato difetti di attributo. Interessante, darò un'occhiata a quello! Grazie! –

+0

Ho una domanda veloce. Per qualche ragione non permette di-molte relazioni, solo attributi e relazioni 1-1. È corretto o un errore? Sto ricevendo: 'Non valido per molte relazioni ... passato a setPropertiesToFetch:' –

+0

Dalla documentazione su -setPropertiesToFetch: "Le descrizioni delle proprietà possono rappresentare attributi, relazioni a uno o espressioni." Penso che per molte relazioni, si consiglia di utilizzare -setRelationshipKeyPathsForPrefetching: –

8

La sezione speciale Considerazioni della documentazione per setPropertiesToFetch: dice

Questo valore viene utilizzato solo se resultType è impostato su NSDictionaryResultType.

Lo snippet di codice non imposta il resultType. Forse intendevi usare setRelationshipKeyPathsForPrefetching :?

+0

ora puoi usarlo per gli oggetti – malhal

0

provare setReturnsDistinctResults: SI

dalla documentazione Apple:

setReturnsDistinctResults:

Imposta se la richiesta fosse fatta ricadere solo valori distinti per i campi specificati da propertiesToFetch.

  • (nulli) setReturnsDistinctResults: (BOOL) valori

Parametri valori Se SI, la richiesta restituisce solo valori distinti per i settori specificati da propertiesToFetch.

-1

Il modo corretto di usare 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"]; 

risultati non è un array di persona oggetti, ma una serie di dizionario. È possibile accedere ai Dizionari inside Ti piace questa

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

Se si desidera solo per lavorare con l'oggetto del modello (che CoreData recupera tutte le proprietà/attribues dell'ente), è possibile progettare il modello con la persona e PersonDetail (che detiene i dettagli informazioni su una persona).In questo modo

  • È possibile eseguire fetchRequest e ottenere un array di oggetti Person
  • Quando si accede aPerson.detail (particolare è una relazione uno-a-uno con PersonDetail), CoreData si esibirà ha provocato l'errore per voi
Problemi correlati