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

Ios 核心数据-父/子层次结构的排序描述符,ios,core-data,nsfetchedresultscontroller,nsfetchrequest,Ios,Core Data,Nsfetchedresultscontroller,Nsfetchrequest,我从一个包含层次结构的HTML请求中获得一个JSON对象 来自JSON对象的示例: { "_id": "4f870f064f95ae0da8000002", "name": "Category", "parent_id": null }, { "_id": "4f870f0e4f95ae0da8000004", "name": "Brand", "parent_id": null }, { "_id": "4f8715bd4f95ae0da

我从一个包含层次结构的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"
}

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

单向-使用OrderedSet-

其次,更方便的是,由于iOS 5中引入了SensorDeredSet,所以它只是一个带sortDescriptors的soimple NSFetchRequest。由于它是一个数组,您可以根据需要一次使用多个描述符。所以,通过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中,在名称中使用下划线并不方便。
希望,这会有所帮助。

无法使用排序描述符对此类数据进行排序。 这就是我如何解决这个问题的方法,通过线程式讨论对文章进行评论。下载所有评论后,我需要重新索引评论


最后,我只需按numValue字段排序,就可以得到我的好的线程讨论

您是否要对它进行解析并将其保存到一个实体的8个对象中,每个对象都有三个属性?到那时您要排序什么?请解释是的,我会做什么。我在存储在单个实体中的单独“NSManagedObjects”中解析它。因为在我接收它们时没有特定的顺序,所以它们在实体中没有层次结构。特别是当我获取更新并只接收带有UID引用的单个更新对象时。当我获取“NSFetchedResultsController”时,我希望将它们按逻辑分层的父级/子级顺序进行排序,并在父级中按字母顺序进行排序。。。。这对您有意义吗?您建议的sortDescriptor只针对对象的_id进行排序,但不考虑根据其父对象的_id在子对象中进行排序。这实际上是一个问题,因为获取仅按一个属性排序的fetchRequest没有问题。你知道如何定义排序描述符来处理这个父/子关系吗?那么,你想用所有的父id来提取所有的子实体,对吗?先按它们的id排序,然后再按它们的父id排序?真的很想理解和帮助你你觉得排序描述符的数组比id和父id都没用吗你也是?用多个描述符看到我的答案好吧,因为我知道没有办法一次就做到这一点。。。因此,可能的解决办法是:1。获取没有父级2的最高级别。取回有父母的其他人3。枚举最高级别的对象并从第二次获取中添加子对象枚举整个层次结构基本上用2个获取请求构建一个数组。。。你用多个描述词看我的答案是什么意思?谢谢你的帮助!!
-(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;
}