I’ve been making a program that uses core data. It has two entities, Medicine and Log
medicines have a set of logs
I have it adding a log to a medicine when its first added. this log includes a date.
I want to show the latest date (there can be more than one log) for the medicine but don’t know how to retrieve the appropriate log. Tutorials i’ve found only show how to add but not retrieve.
This is what i have so far, it displays the medicine name. i want to change the detailtextlabel to show the date of the latest log entry
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@"%@",object);
cell.textLabel.text = [object valueForKey:@"name"];
cell.detailTextLabel.text = [[object valueForKey:@"active"] stringValue];
}
- (NSFetchedResultsController *)fetchedResultsController
{
if (__fetchedResultsController != nil) {
return __fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *medicines = [NSEntityDescription entityForName:@"Medicines" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:medicines];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"active" ascending:NO];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return __fetchedResultsController;
}
You give very little details on your setup, so it’s tough to give you a detailed answer.
Let’s tell you have something like that:
At some point, you have a NSFetchRequest. It should look like this:
Now the magic starts.
The first entry in the resulting set will be the most recent. ‘fetchedLogs’.firstObject.date will return the most recent log entry date.
As I said, I cannot give you a more tailored answer as your question wasn’t very detailed.
edit: Oh, you added some details while I was writing this. All right, I do not know how the relationship between medicines and log entries looks like. Probably something close to what I proposed above. So all you need is:
This will return the highest date in the logs set.
edit: oops, my bad, valueForKeyPath, not just valueForKey.