CoreData:如何通过主键对NSManagedObject进行排序?

tai*_*ino 3 iphone core-data objective-c

我有一个NSManagedObject的子类,如下所示,并通过NSManagedObjectContext存储了一些实例.

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

现在,我想获取按主键排序的列表(自动创建).我尝试过NSFetchRequest并遇到运行时错误:"在实体中找不到keypath id".

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];
Run Code Online (Sandbox Code Playgroud)

是否可以按主键排序?或者我应该在Model类中添加一些列进行排序?

bbu*_*bum 7

假设主键是一个不透明的数据类型,其值是一个完全在你的控件之外的任意实现细节(包括可能不会随着时间的推移而变化),想要按它排序似乎是不合理的.

如果您正在寻找一个稳定的,确定的订单,那么 - 是 - 按不同的属性排序,无论是现有属性还是新属性.

请注意,通常,最好不要考虑关系数据库术语中的核心数据.专注于对象图和对象建模方面,因为这是API所关注的.

  • 在纯RDB中,你必须做同样的事情(例如:sqlite有rowid,但是当数据库被抽真空时它们会改变)......无论如何,"插入顺序"的概念对你来说非常具体.特定的商业案例,因此,鉴于大多数实体没有必要,不应该"免费"提供. (2认同)
  • 继续@bbum的评论之后,您想要的只是为创建日期添加属性(或者您的上下文的任何适当名称).然后在获取时对此日期值进行排序. (2认同)