2011-09-15 6 views
18

Ho una richiesta di recupero definita all'interno del mio modello di dati di base denominato "RemainingGaneProjections". Voglio eseguire quella richiesta di recupero e ordinare i risultati per uno degli attributi dell'entità. Il mio codice è simile al seguente:Applicazione del descrittore di ordinamento a NSFetchRequest creato dal modello

NSFetchRequest *projectionsRequest = [model fetchRequestTemplateForName:@"RemainingGameProjections"]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidence" ascending:NO]; 
[projectionsRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

Quando provo ad eseguire questo codice si blocca con il seguente messaggio:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Can't modify a named fetch request in an immutable model.' 

mi hanno confermato nel debugger che questo incidente si verifica quando eseguo il metodo setSortDescriptors sulla mia NSFetchRequest. Non sono stato in grado di capire perché questo accade.

Eventuali spiegazioni per ciò che sta accadendo qui? C'è un altro approccio che dovrei usare quando si recuperano i dati che devono essere ordinati?

risposta

35

Ho trovato la risposta nella documentazione Apple di tutti i luoghi. Poiché la mia richiesta di recupero non ha parametri di sostituzione, ho usato il metodo fetchRequestTemplateForName invece di fetchRequestFromTemplateWithName. Come si è visto, la guida di programmazione Core Data dice questo:

Se il modello non dispone di variabili di sostituzione, è necessario:

  1. Uso fetchRequestFromTemplateWithName: substitutionVariables: e passare nullo come variabili discussione;
  2. Usa fetchRequestTemplateForName: e copia il risultato. Se si tenta di utilizzare la richiesta di recupero restituita da fetchRequestTemplateForName :, viene generata un'eccezione ("Impossibile modificare una richiesta di recupero denominata in un modello immutabile").

ho modificato il mio prendere richiesta di inizializzazione per fare questo:

NSFetchRequest *projectionsRequest = [[model fetchRequestTemplateForName:@"RemainingGameProjections"] copy]; 

e ora tutto funziona come previsto.

+0

E presumo che abbiate aggiunto anche un 'release' per' projectionsRequest'. –

+12

No: sto usando ARC per questo progetto;) –

Problemi correlati