【问题标题】:What is the best way to sort a Core Data Entity?对核心数据实体进行排序的最佳方法是什么?
【发布时间】:2012-07-20 23:35:20
【问题描述】:

我有一个完全正常工作的核心数据模型,但是当我使用 fetch 请求返回数据时,它的顺序看似随机。对这些数据进行排序的最佳方法是什么?是在核心数据模型中使用另一个表,然后“查询”第一个?还是将数据拉到一个数组中,然后这样排序?

我不太清楚如何做这两个,这就是我问这个问题的原因。

【问题讨论】:

    标签: ios xcode arrays core-data


    【解决方案1】:

    你的问题很笼统,但我会尽量给你一些提示。

    当您使用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
    

    在哪里

    是您要检索的实体的名称,例如Manager.

    是请求将用于排序的键的名称,例如nameManager 实体的属性。

    所以,在我的例子中:

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

    由于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];
    

    希望对您有所帮助。

    编辑

    由于fetchedObjects 包含NSManagedObject(我想您没有更改请求的结果类型),您需要进行如下迭代:

    for(NSManagedObject* currentObj in fetchedObjects) {
    
        NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
    }
    

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

    【讨论】:

    • 非常好,正是我需要的。谢谢!
    • 只是一个快速的。我现在如何访问数组中的每个“条目”?例如,如果我按价格、升序排序,我将如何选择该条目并访问其他字段(名称、品牌等)。我的猜测是使用 for * in * 循环,但我不确定我将使用什么作为数据类型。我现在的代码是: for (NSString *data in fetchedObjects) { NSLog(@"%@",data);但我不知何故认为这是错误的。
    • @flexaddicted 感谢您的示例,在我处理一些代码时帮助了我。顺便说一句,您是否知道 MagicalRecord 框架(请参阅:github.com/magicalpanda/MagicalRecord),使用它可以使 CoreData 的东西变得相当简单并且代码更少?
    • @iOS-Coder 抱歉,我无法理解您的问题。你能解释一下你的意思吗?谢谢。
    • @flexaddicted 实际上,这并不是一个问题,而是关于如何快速开始(以最少的编码)使用 CoreData 进行编程的建议。
    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多