我有一个完全正常工作的核心数据模型,但是当我使用 fetch 请求返回数据时,它的顺序看似随机。对这些数据进行排序的最佳方法是什么?是在核心数据模型中使用另一个表,然后“查询”第一个?还是将数据下拉到数组中,然后以这种方式排序?
我不太确定如何做这些,这就是我问这个问题的原因。
你的问题很笼统,但我会尽量给你一些提示。
当您使用NSFetchRequest
类时,您可以指定排序描述符。
来自苹果文档:
一组排序描述符(的实例
NSSortDescriptor
),指定返回的对象应如何排序,例如按姓氏然后按名字。
在这里,您可以在Core Data Snippets doc中找到一个简单的示例
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
在哪里
<#Entity name#>是您要检索的实体的名称,例如Manager
.
<#Sort key#>是请求将用于排序的键的名称,例如name
是Manager
实体的属性。
所以,在我的例子中:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
由于setSortDescriptors:
设置了一个排序描述符数组,因此您可以根据您想要的顺序指定多个键。例如,指定针对name
and进行排序salary
。排序描述符按照它们在 sortDescriptors 数组中出现的顺序应用。因此,在我的示例中,首先是 by name
,然后是 by 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
(我想您没有更改请求的结果类型),您需要像下面这样迭代:
for(NSManagedObject* currentObj in fetchedObjects) {
NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}
因此,您需要通过键值编码来访问属性或关系。为了让您的生活更轻松,您可以考虑为NSManagedObject
您创建的实体创建子类,例如organising-core-data-for-ios。