0

Я получаю объект JSON из HTML-запроса, который содержит иерархическую структуру.Основные данные - дескриптор сортировки для иерархии parent/child

Пример из объекта 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" 
} 

Когда я сохранить его таким же образом, всего за одно целое, как бы я определить запрос выборки (сортировки), так что объекты сортируются вместе со своим родителем/ребенком отношение?

+0

Вы собираетесь разобрать его и сохранить его на 8 объектов одного объекта, каждый из которых имеет три атрибута? Что вы собираетесь сортировать к тому времени? Пожалуйста, объясните –

+0

Да, именно то, что я буду делать. Я разбираю его в отдельных «NSManagedObjects», хранящихся в одном объекте. Поскольку нет конкретного порядка, когда я их получаю, они не упорядочены иерархически внутри объекта. Тем более, что я получаю обновления и получаю только отдельные обновленные объекты с помощью ссылки UID. Когда я беру для «NSFetchedResultsController», я хочу сортировать их в логическом иерархическом родительском/дочернем порядке (и в целом в алфавитном порядке в пределах родителей ...). Это имеет смысл для вас? –

+0

Да, см. Ответ) –

ответ

-1

One Way - использовать NSOrderedSet - http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSOrderedSet_Class/Reference/Reference.html

Во-вторых, более удобный (с NSOrderedSet вводится прошивкой 5), просто soimple NSFetchRequest с sortDescriptors.Since это массив, вы можете использовать множество descritors в время, как вы хотите. Таким образом, использование дескрипторов на 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 нецелесообразно использовать подчеркивания в именах. Надеюсь, что помогает.

+0

Ваш предложенный sortDescriptor как сортирует только для «_id» объектов, но не заботится о сортировке в дочерних элементах соответственно их «parent_id». На самом деле это вопрос, так как без проблем получить fetchRequest, просто отсортированный по одному атрибуту. Любая идея, как определить sortDescriptor, чтобы заботиться об этом отношении родитель/ребенок? –

+0

Итак, вы хотите сделать выборку для всех дочерних enteties.With all parent_ids.Right? И отсортировать их сначала их _ids, а затем их parent_ids? Действительно муравьи, чтобы понять и помочь вам) –

+0

Вы чувствуете, что массив сортировки (от _id и parent_id) тоже не помогут? –

0

Невозможно отсортировать данные такого типа с помощью sortDescriptors. Вот как я решаю проблему, имея комментарии к статье с обсуждениями в стиле резьбы. После того, как я загружаю все комментарии, мне нужно 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 полю, чтобы получить мой хорошие резьбовое обсуждение