核心数据 - 父/子层次结构的排序描述符

Posted

技术标签:

【中文标题】核心数据 - 父/子层次结构的排序描述符【英文标题】:Core Data - Sort descriptor for parent / child hierarchy 【发布时间】:2012-04-12 19:52:42 【问题描述】:

我从一个包含层次结构的 html 请求中得到一个 JSON 对象。

来自 JSON 对象的示例:


    "_id": "4f870f064f95ae0da8000002",
    "name": "Category",
    "parent_id": null
,

    "_id": "4f870f0e4f95ae0da8000004",
    "name": "Brand",
    "parent_id": null
,

    "_id": "4f8715bd4f95ae0da8000028",
    "name": "Dermalogica",
    "parent_id": "4f870f0e4f95ae0da8000004"
,

    "_id": "4f8715de4f95ae0da800002a",
    "name": "Molton Brown",
    "parent_id": "4f870f0e4f95ae0da8000004"
,

    "_id": "4f8715ea4f95ae0da800002c",
    "name": "Waxing",
    "parent_id": "4f870f064f95ae0da8000002"
,

    "_id": "4f8715f34f95ae0da800002e",
    "name": "Mens Hair",
    "parent_id": "4f870f064f95ae0da8000002"
,

    "_id": "4f8715fd4f95ae0da8000030",
    "name": "Ladies Hair",
    "parent_id": "4f870f064f95ae0da8000002"
,

    "_id": "4f87161f4f95ae0da8000032",
    "name": "Massage",
    "parent_id": "4f870f064f95ae0da8000002"

当我以相同的方式将它保存在一个实体中时,我将如何定义获取请求(排序)以便对象按照它们的父/子关系进行排序?

【问题讨论】:

你要解析它并保存到一个实体的8个对象中,每个对象都有3个属性吗?那你打算怎么排序?请解释一下 是的,正是我会做的。我将其解析为存储在一个实体中的单独的“NSManagedObjects”。由于我收到它们时没有特定的顺序,因此它们在实体内没有按层次排序。特别是当我获取更新并仅接收带有 UID 引用的单个更新对象时。当我获取“NSFetchedResultsController”时,我想将它们排序为逻辑分层父/子顺序(并且在父级中整体按字母顺序...)。这对你有意义吗? 【参考方案1】:

无法使用 sortDescriptors 对此类数据进行排序。 这就是我解决问题的方法,有很多文章带有线程样式的讨论。下载完所有cmets后需要reindexComments

-(void)reindexComments
    NSArray *articleComments = self.comments.allObjects;
    [self fetchChildsWithComments:articleComments forParentId:0 num:1];


-(NSUInteger)fetchChildsWithComments:(NSArray*)articleComments forParentId:(NSUInteger)parentId num:(NSUInteger)num
    NSArray *childComments = [articleComments filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"parentId == %u", parentId]];
    childComments = [childComments sortedArrayUsingComparator:^NSComparisonResult(Comment *c1, Comment *c2) 
        if (c1.commentIdValue < c2.commentIdValue)
            return NSOrderedAscending;
        else
            return NSOrderedDescending;
        
    ];

    for (Comment *newRootComment in childComments)
        newRootComment.numValue = num;
        num++;
        num = [self fetchChildsWithComments:articleComments forParentId:newRootComment.commentIdValue num:num];
    
    return num;

最后我只是按numValue 字段进行排序,以获得我很好的线程讨论

【讨论】:

【参考方案2】:

一种方法 - 使用 NSOrderedSet - http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSOrderedSet_Class/Reference/Reference.html

第二,更方便(因为NSOrderedSet是在ios 5中引入的),只是一个简单的NSFetchRequest和sortDescriptors。因为它是一个数组,你可以一次使用多个描述符。因此,使用 parent_idid 的描述符应该会给您想要的结果。

NSFetchRequest *request = [[NSFetchRequest alloc]init];
    request.entity = [NSEntityDescription entityForName:@"Child" inManagedObjectContext:context];
   // request.predicate = [NSPredicate predicateWithFormat:@"parent_id =  %@",parent_ID];You don't need any predicate,right?
    request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"parent_id" ascending:YES],[NSSortDescriptor sortDescriptorWithKey:@"_id" ascending:YES],nil];

return [context executeFetchRequest:request error:&error];

而且,在 Objective-C 中,在名称中使用下划线并不方便。 希望,这会有所帮助。

【讨论】:

您建议的 sortDescriptor 仅针对对象的“_id”进行排序,但不关心根据其“parent_id”对子项进行排序。这实际上是一个问题,因为获取仅按一个属性排序的 fetchRequest 是没有问题的。知道如何定义 sortDescriptor 来处理这种父/子关系吗? So.You 想要获取所有子实体。使用所有 parent_ids。对吗?并首先按它们的 _ids 排序它们,然后按它们的 parent_ids 排序?真的很理解并帮助你) 你觉得 sortdescriptors 数组(按 _id 和 parent_id)对你也没有帮助吗? 用多个描述符查看我的答案 好的,据我所知,没有办法一次性做到这一点......因此可能的解决方案是:1.获取***别​​(没有父母)2.获取休息(即确实有父母) 3. 枚举***别的对象并从通过层次结构枚举的第二次获取添加子级 基本上从 2 个获取请求中构建一个数组......“查看我的多个描述符的答案”是什么意思?谢谢你的帮助!!

以上是关于核心数据 - 父/子层次结构的排序描述符的主要内容,如果未能解决你的问题,请参考以下文章

带有比较器的核心数据排序描述符

使用 NSDate 的核心数据排序描述符,使用 Swift 的 iOS

具有本地化字符串的核心数据排序描述符

核心数据和 NSSortDescriptor 未根据基于 NSString 的第三个描述符排序

网络编程基础(02)

Linux中进程间传递文件描述符的方法