5
votes

I have one subclass of NSManagedObject like following and stored some instances by NSManagedObjectContext.

@interface SomeModelObject : NSManagedObject  
  @property (nonatomic, retain) NSString * text; 
@end

Now, I want to fetch the list sorted by its primary key (created automatically). I've tried NSFetchRequest and got runtime error: "keypath id not found in entity".

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

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sort, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

Is it possible to sort by primary key? Or should I add some column to Model class for sorting?

2

2 Answers

10
votes

Given that the primary key is an opaque data type whose value is an arbitrary implementation detail completely outside of your control (including potentially not being constant over time), it seems non-sensical to want to sort by it.

If you are looking for a stable, determined, order, then -- yes -- sort by a different attribute, either an existing one or a new one.

Note that, in general, it is best to not think of Core Data in relational database terms. Focus on the object graph and object modeling aspects as that is what the APIs are focused upon.

3
votes

Use a sort descriptor with self as the sort key (instead of id). The underlying SQL will have ORDER BY t0.Z_PK.

Warning: as mentioned by vastopa below this is undocumented and crashes in iOS 10, and there is also a non-null probability that this breaks in a future version of iOS, so use at your own risk.