2012-04-12 13 views
0

Ich bekomme ein JSON-Objekt von einer HTML-Anfrage, die eine hierarchische Struktur enthält.Core Data - Sortierdeskriptor für Eltern/Kind-Hierarchie

Probe von JSON-Objekt:

{ 
    "_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" 
} 

Wenn ich es auf die gleiche Art und Weise speichern in nur einer Einheit, wie würde ich die Abrufanforderung (Sortierung) definieren, so dass die Objekte mit ihren Eltern/Kind sortiert Beziehung?

+0

Gehst du es zu analysieren und zu 8 Objekte eines Unternehmens zu speichern, Jeder hat drei Attribute? Was werden Sie dann sortieren? Bitte erklären Sie –

+0

Ja, genau das, was ich tun würde. Ich analysiere es in separaten 'NSManagedObjects', die in einer einzigen Entität gespeichert sind. Da es keine bestimmte Reihenfolge gibt, wenn ich sie erhalte, sind sie nicht hierarchisch in der Entität angeordnet. Zumal ich nach Updates hole und nur einzelne aktualisierte Objekte mit einer UID-Referenz empfange. Wenn ich nach 'NSFetchedResultsController' suche, möchte ich sie in die logische hierarchische Eltern/Kind-Reihenfolge (und insgesamt alphabetisch innerhalb der Eltern ...) sortieren. Ergibt das Sinn für dich ? –

+0

Ja, siehe die Antwort) –

Antwort

-1

One Way - NSOrderedSet verwenden - http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSOrderedSet_Class/Reference/Reference.html

Zweitens convinient (seit NSOrderedSet in iOS 5 eingeführt wird), nur ein soimple NSFetchRequest mit sortDescriptors.Since es ist ein Array, können Sie ein viele descritors verwenden bei eine Zeit wie du willst. Also, mit Deskriptoren von parent_id und ID sollte Ihnen das gewünschte Ergebnis geben.

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

Und in Objective-C ist es nicht praktisch, Unterstreichungen in Namen zu verwenden. Hoffe, das hilft.

+0

Ihr vorgeschlagener Sortierdeskriptor sortiert nur nach der "_id" der Objekte, kümmert sich aber nicht darum, die Kinder entsprechend ihrer "parent_id" zu sortieren. Das wäre eigentlich die Frage, da es kein Problem ist, eine fetchRequest nur nach einem Attribut zu sortieren. Irgendeine Idee, wie man den Sortierdeskriptor definiert, um sich um diese Eltern/Kindbeziehung zu kümmern? –

+0

So.Sie wollen einen Aufruf an alle Kinder enteties.With alle parent_ids.Right? Und sortieren sie zuerst durch ihre _ids und dann durch ihre parent_ids? Wirklich ant zu verstehen und Ihnen helfen) –

+0

Sie fühlen sich wie Array von sortdescriptors (von _id und parent_id) wird dir auch nicht helfen? –

0

Es gibt keine Möglichkeit, diese Art von Daten mit sortDescriptors zu sortieren. So löste ich das Problem, Kommentare des Artikels mit Thread-Diskussionen zu haben. Nachdem ich alle Kommentare herunterzuladen, muss ich 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; 
} 

und schließlich nur ich sortiere nach numValue Feld meine schöne Gewinde zu erhalten Diskussion