2013-08-20 12 views
5

sto ottenendo il seguente messaggio di errore:Bizarre edizione - "L'oggetto inverosimile a indice x ha un fuori servizio nome della sezione"

CoreData: error: (NSFetchedResultsController) The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name' 
Unresolved search error Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0xaa07530 {reason=The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'}, { 
    reason = "The fetched object at index 5 has an out of order section name 'James. Objects must be sorted by section name'"; 
} 

Ho passato con innumerevoli risposte sul SO che in gran parte finiscono indicando utilizzando CASEINSENSITIVE confrontare come la risposta tuttavia come potete vedere qui sotto la mia prendere richiesta è già configurato per fare questo:

<NSFetchRequest: 0xc082bd0> (entity: InviteeModel; predicate: (eventId == 148 AND typeOf != "InviteeTypeOfServerContact"); sortDescriptors: ((
    "(lastName, ascending, caseInsensitiveCompare:)", 
    "(firstName, ascending, caseInsensitiveCompare:)" 
)); batch size: 1000; type: NSManagedObjectResultType;) 

mi sembrava di aver ristretto la scelta per il caso in cui ho due invitati con lo stesso cognome (vale a dire HENRY JAMES e Henry James) quindi ho ricevuto l'errore sopra dicendo questo James è fuori uso. Se cambio entrambi i cognomi su James o JAMES, allora funziona?!?!?

Ecco il codice che crea la richiesta di recupero:

NSFetchRequest *fetchRequest = [self buildFetchRequest]; 

// We have to reset the fetched results controller if the sort changes. 
// Because otherwise the scrolling index will be inaccurate. 
if (self.fetchedResultsController) { 
    if (![self.fetchedResultsController.sectionNameKeyPath isEqualToString:self.sortBy]) { 
     self.fetchedResultsController = nil; 
    } 
} 


if (!self.fetchedResultsController) { 

    NSManagedObjectContext *context = self.event.managedObjectContext; 

    NSString *sectionNameKeyPath = nil; 
    if (self.sortBy == DefaultSortBy) { 

     sectionNameKeyPath = @"sectionChar"; 
    } 
    else { 

     sectionNameKeyPath = self.sortBy; 
     if ([self.sortBy isEqualToString:@"rsvpState"] || [self.sortBy isEqualToString:@"checkedIn"]) { 
      sectionNameKeyPath = @"lastName"; 
     } 
    } 

    NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                           managedObjectContext:context 
                           sectionNameKeyPath:sectionNameKeyPath 
                              cacheName:nil]; 
    fetchedResultsController.delegate = self; 
    self.fetchedResultsController = fetchedResultsController; 

e qui è un pezzo dal buildFetchRequest che aggiunge le sortDescriptors:

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:self.sortBy 
                     ascending:self.shouldSortAscending 
                     selector:@selector(caseInsensitiveCompare:)]; 

     // Add the default sorts (last, first). 
     NSSortDescriptor *lastSort = nil; 
     NSSortDescriptor *firstSort = nil; 
     if (![self.sortBy isEqualToString:@"lastName"]) { 
      lastSort = [NSSortDescriptor sortDescriptorWithKey:@"lastName" 
                ascending:YES 
                 selector:@selector(caseInsensitiveCompare:)]; 
     } 
     if (![self.sortBy isEqualToString:@"firstName"]) { 
      firstSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" 
                 ascending:YES 
                 selector:@selector(caseInsensitiveCompare:)]; 
     } 

     NSArray *sorts = nil; 

     if (lastSort && firstSort) { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, firstSort, nil]; 
     } 
     else if (lastSort) { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, lastSort, nil]; 
     } 
     else { 
      sorts = [[NSArray alloc] initWithObjects:sortDescriptor, firstSort, nil]; 
     } 

     [fetchRequest setSortDescriptors:sorts]; 

Tutte le idee, questo mi sta facendo impazzire.

+0

Puoi NSLog il completo recuperatoResultsController? –

+0

@MartinR, grazie per l'aiuto. C'è qualcosa di specifico che stai cercando in the frc che posso stampare? È un grande oggetto e nslogging mi dà solo l'indirizzo. –

+0

La mia domanda principale è se sectionNameKeyPath e il primo descrittore di ordinamento usano sempre la stessa chiave. Non è ovvio per me dal tuo codice. –

risposta

2

Si sta impostando un percorso chiave per il nome della sezione del controller risultati recuperato diverso dal primo codice descrittore di ordinamento.

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
      initWithKey:self.sortBy 
      ascending:self.shouldSortAscending 
      selector:@selector(caseInsensitiveCompare:)]; 

La chiave è self.sortBy.

if ([self.sortBy isEqualToString:@"rsvpState"] || 
    [self.sortBy isEqualToString:@"checkedIn"]) { 
     sectionNameKeyPath = @"lastName"; 
} 

chiave non è self.sortBy.

Ciò dovrebbe causare l'errore visualizzato.

+0

Ciao @Mundi, ho stampato il valore di self.sortBy e FRC sectionNameKeyPath ed è sempre "lastName" anche quando si presenta l'errore, quindi non sono sicuro se è così? –

+0

Stampare anche il percorso chiave del primo descrittore di ordinamento e confrontare. – Mundi

0

Bene, la domanda chiave è quale proprietà sta determinando sectionNameKeyPath e se tale proprietà è stata utilizzata come primo descrittore di ordinamento nell'array descrittore di ordinamento.

Immagino sia la prima cosa da verificare se si verifica un problema di questo tipo.

Problemi correlati