12

Używam NSFetchedResultsController z predykatem do załadowania listy Documents w mojej aplikacji. Chcę załadować wszystkie Documents oprócz aktualnie aktywnego.Podstawowe dane: Keypath "objectID" nie znaleziono w obiekcie

Używam MOGenerator firmy Rentzsch do utworzenia klasy _Document, a następnie umieszczam cały mój niestandardowy kod w podklasie Document. _Document generuje właściwość objectID z typem DocumentID.

W klasie, która tworzy kontroler, ustawić sterownika currentDocID właściwość:

controller.currentDocID = self.document.objectID; 

w samym kontrolerze, ja leniwy załadować fetchedResultsController tak:

- (NSFetchedResultsController *)fetchedResultsController { 
    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID != %@)", self.currentDocID]; 
    [fetchRequest setPredicate:predicate]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateModified" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [sortDescriptor release]; 
    [sortDescriptors release]; 

    return fetchedResultsController; 
} 

Po załadowaniu fetchedResultsController , moja aplikacja ulega awarii z nieobsługiwanym wyjątkiem:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath objectID not found in entity <NSSQLEntity Document id=1>' 

Rozumiem, że wszystkie obiekty NSManagedObject mają objectID, zarówno tymczasowy, jak i stały. Czy tak nie jest? jakieś pomysły?

Odpowiedz

10

Zmień swoje orzeczenie do zapoznania

[NSPredicate predicateWithFormat:@"self != %@", [self currentDoc]] 

Gdzie currentDoc jest odwołaniem do instancji NSManagedObject który reprezentuje bieżący dokument.

Core Data wykona wewnętrznie kontrolę równości.

+2

Czy wiesz, dlaczego '... @" self! =% @ ", [Self currentDoc]]' nie jest tym samym, co '... @" (objectID! =% @) ", Self.currentDocID] '. Zgodnie z tym postem http://stackoverflow.com/a/2306550/647644 powinno być ono równoważne. – Lindemann

+0

@Lindemann Najlepiej, jeśli utworzysz nowe pytanie. –

Powiązane problemy