I'm using NSFetchedResultsController
to display a table of my NSManagedObject
data.
Up to now, I've been using the name
property on my objects to sort them:
NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:[Item entityName]];
NSSortDescriptor* nameSorter = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
request.sortDescriptors = @[nameSorter];
self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.moc
sectionNameKeyPath:@"nameInitial"
cacheName:nil];
Note that my sectionNameKeyPath
is different from my sort request. As in this answer, I use a transient property on Item
, called nameInitial
. Its getter just reads name and returns the first letter.
So far so good. But now, I want to add a special condition: if the first word of the name is 'the', I don't want to sort by that. I want to sort by the first letter of the 2nd word. I can't do this with a transient property because now, the NSSortDescriptor
on the fetch request will give a different order than the sectionNameKeyPath
, which makes NSFetchedResultsController
barf.
So I added a nameInitial
field to Item
and performed a lightweight migration. Now, I can add a NSSortDescriptor
using this new attribute. I just have to populate it with the right letter. This is where my problem comes in: What do I do with the objects I already have in the DB, for which the nameInitial
attribute is nil? As far as I can tell, these are my options:
Write a code that executes upon the first launch of the new version of the app, reads all the
name
fields and updatesnameInitial
appropriately.Use
awakeFromFetch
to automatically updatenameInitial
for each object as it is loaded.Override the getter of
nameInitial
, so it updates itself if it's nil.
I don't particularly like any of these options. The first one isn't elegant at all, and the last two mean either the awakeFromFetch
or the getter will have unexpected side-effects. Is there a better way to do this that I'm missing?