排序核心数据实体的最佳方法是什么?

Ale*_*ere 10 arrays xcode core-data ios

我有一个完全工作的核心数据模型,但是当我使用获取请求返回数据时,它看起来是一个看似随机的顺序.排序此数据的最佳方法是什么?是在Core Data模型中使用另一个表,还是'查询'第一个?或者是将数据下拉到数组中,然后按这种方式排序?

我不太确定如何做其中任何一个,这就是我问这个问题的原因.

Lor*_*o B 36

你的问题很普遍,但我会试着给你一些提示.

使用NSFetchRequest类时,可以指定排序描述符.

来自Apple doc:

一组排序描述符(实例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
Run Code Online (Sandbox Code Playgroud)

哪里

<#Entity name#>是您要检索的实体的名称,例如Manager.

<#Sort key#>是请求将用于订购的密钥的名称,例如,nameManager实体的属性.

所以,在我的例子中:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
    ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
Run Code Online (Sandbox Code Playgroud)

由于setSortDescriptors:设置了排序描述符数组,因此您可以指定要对其进行排序的多个键.例如指定反对namesalary.排序描述符按它们在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];
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

编辑

由于fetchedObjectscontains NSManagedObject(我想您没有更改请求的结果类型),您需要像下面这样迭代:

for(NSManagedObject* currentObj in fetchedObjects) {

    NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}
Run Code Online (Sandbox Code Playgroud)

因此,您需要通过键值编码访问属性或关系.为了让您的生活更轻松,您可以考虑为NSManagedObject您创建的实体创建子类,例如组织core-data-for-ios.