sorting核心数据实体的最佳方法是什么?
我有一个完整的核心数据模型,但是当我使用提取请求返回数据时,它看起来是随机的。 sorting这些数据的最好方法是什么? 是在核心数据模型中使用另一个表,并“查询”第一个? 或者是将数据拉入数组,然后按这种方式sorting?
我不太清楚如何做这两个,这就是我问这个问题的原因。
你的问题是相当一般的,但我会尝试给你一些提示。
当你使用NSFetchRequest
类时,你可以指定sorting描述符。
来自Apple文档:
一组sorting描述符(
NSSortDescriptor
实例),用于指定返回对象的sorting方式,例如按姓氏和名字sorting。
在这里你可以在Core Data Snippets文档中find一个简单的例子
NSManagedObjectContext *context = <#Get the context#>; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; NSError *error = nil; NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; if (fetchedObjects == nil) { // Handle the error } // release allocated objects if you don't use ARC
哪里
<#实体名称#>是您要检索的实体的名称,例如Manager
。
<#Sort key#>是请求用于订购的密钥的name
,例如name
是Manager
实体的属性。
所以,在我的例子中:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil]; [fetchRequest setSortDescriptors:sortDescriptors];
由于setSortDescriptors:
设置了一个sorting描述符数组,所以您可以指定多个关键字来对您进行sorting。 例如指定对name
和salary
进行sorting。 sorting描述符按照它们出现在sortDescriptors数组中的顺序进行应用。 所以,在我的例子中,首先是name
,然后是salary
。
所以,在我的例子中,它可能成为
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil]; [fetchRequest setSortDescriptors:sortDescriptors];
希望有所帮助。
编辑
由于fetchedObjects
包含NSManagedObject
(我想你没有改变请求的结果types),你需要像下面这样迭代:
for(NSManagedObject* currentObj in fetchedObjects) { NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]); }
所以,你需要通过Key Value Coding来访问属性或关系。 为了让你的生活更轻松,你可以考虑为你创build的实体创buildNSManagedObject
子类,像organizational-core-data-for-ios 。