Ich bin neu bei Kerndaten und versuche herauszufinden, wie Sie eine benutzerdefinierte sectionNameKeyPath
in meinem NSFetchedResultsController
erstellen. Ich habe ein verwaltetes Objekt mit einem Attribut namens acctPeriod
. Es ist ein NSString
. Ich möchte Abschnitte basierend auf den ersten 4 Zeichen dieses Feldes erstellen. Die ersten 4 Zeichen stellen das Jahr des Abrechnungszeitraums dar und müssen nicht gespeichert werden.Benutzerdefinierte Kerndaten SectionNameKeyPath
Ich bin durch diese Seite gegangen und habe Beiträge über transiente Attribute gesehen, aber ich kann nicht scheinen, sie zur Arbeit zu bringen. Grundsätzlich möchte ich dies und dann periodYear
für meine sectionNameKeyPath
zuweisen.
@dynamic periodYear;
-(NSString *)periodYear
{
return [self.acctPeriod substringToIndex:4];
}
Jede Hilfe wäre willkommen.
** UPDATE: Mit Martin R. Antwort konnte ich es wie erwartet funktionieren.
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Billing" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"acctPeriod" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
//Predicate
NSPredicate *pred = [NSPredicate predicateWithFormat:@"clients = %@", self.client];
NSLog(@"%@",pred);
//[fetchRequest setResultType:NSDictionaryResultType];
//[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setPredicate:pred];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"periodYear" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
OK, das hat super funktioniert. Ich habe das schon einmal versucht, aber das Problem ist, dass ich versuche nur 1 meiner Entitäten, acctPeriod, zu laden und sie nach periodYear zu sortieren.Also habe ich verwendet [fetchRequest setPropertiesToFetch: [NSArray arrayWithObjects: [entityProperties objectForKey: @ "acctPeriod"], nil]]; das scheint nicht zu funktionieren. Ich habe versucht, periodYear als entityProperty zu setzen, aber ich weiß, dass es nicht ist. Ich erhalte diesen Fehler: 'Ungültiger Schlüsselpfad periodYear wurde an setPropertiesToFetch übergeben:' Irgendwelche Gedanken? – theDVUSone
@theDVUSone: Wenn Sie 'propertiesToFetch' verwenden, müssen Sie wahrscheinlich' periodYear' als transientes Attribut definieren und es zu 'propertiesToFetch' hinzufügen. Ich habe es nicht versucht, aber das nehme ich an. –
Ich machte den Fehler, eine @property zu deklarieren, die einen Getter implementierte. Diese Lösung hat mehr oder weniger darauf hingewiesen, dass es sich nur um eine Methodendeklaration handeln sollte. – JLust