核心数据 - 父/子层次结构的排序描述符
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_id 和 id 的描述符应该会给您想要的结果。
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