2014-02-10 12 views
5

Es gibt viele Themen zu Kerndaten Baumstrukturen, aber ich bin mit einigen Fragen übrig.Core Data Directory (Struktur) Struktur

Was ich versuche zu erstellen ist eine einfache Verzeichnisstruktur. (. Ordner mit Unterordnern mit Unterordnern, ... und später auch Dateien)

Ich habe jetzt diese Einheit Folder: enter image description here

Und ich bin Hinzufügen von Ordnern wie folgt aus: [Offensichtlich ist diese Dummy-Daten und dies wird dynamicly später eingefügt]

// root 1 
Folder *root1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context]; 
root1.name = @"Root 1"; 
root1.parent = nil; 

// folder 1 in root 1 
Folder *subFolder1 = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:context]; 
subFolder1.name = @"Folder 1 in root 1"; 
subFolder1.parent = root1; 

root1.children = [NSSet setWithObjects: subFolder1, nil]; 

Jetzt will ich für jeden Ordner einen Viewcontroller machen und öffnen Sie dann einen neuen Viewcontroller für jeden Unterordner. (Oder eine unendliche UITabelView)

Wenn ich Schleife in der Ordner-Einheit mit diesem Code:

NSArray *folders = [context executeFetchRequest:fetchRequest error:&error]; 
for(Folder *folder in folders){ 
    NSLog(@"Profile: %@", folder.name); 
} 

ich alle Ordner auf einmal.

Die Frage ist also: Wie kann ich das in einer Baumstruktur abmelden? So kann ich zuerst einen ViewController für alle Stammordner erstellen und dann für jeden Unterordner einen anderen ViewController etc. etc ... (Mit anderen Worten: Wie kann ich diese Entity lesen, wie ich es in ein UITabelView schreiben würde)

+1

Verwenden Sie einen abgerufenen Ergebnis-Controller, sparen Sie viel Ärger. In Ihrem ViewController erstellen Sie ein ivar für den übergeordneten Ordner, setzen Sie dies für den ersten viewController (oberste Ebene) auf nil. Wenn Sie einen Ordner in der Tabellenansicht auswählen, erstellen Sie eine weitere Instanz von viewController, und setzen Sie das zugehörige ivar auf das ausgewählte Element (übergeordnetes Element) und schieben Sie es auf den Stapel. Verwenden Sie das Prädikat wie von Tom unten beschrieben. Wenn Sie ein Array wie Sie verwenden, werden Bearbeitungen nicht automatisch in Ihren UITableViews angezeigt. Sehen Sie sich das Video an, um eine App mit derselben Ordner-/Dokumentstruktur anzuzeigen, die Core Data verwendet. –

+0

Unterstützt Drag & Drop usw.Sie werden keine Details darüber finden, wie diese Hierarchie von Ordnern und Dokumenten auf der Site implementiert ist, aber ich kann einige Details hinzufügen, wenn Interesse besteht. http://ossh.com.au/design-and-technology/software-development/uimanageddocument-icloud-integration/os-x-and-ios-app-integration-with-core-data-and-icloud/ –

+0

Wirklich hilfreich, danke! – Lapidus

Antwort

6

Sie geben nicht an, wie Ihre Abrufanforderung aufgebaut ist, aber der Schlüssel besteht darin, die NSPredicate zu verwenden, um die Ergebnisse nur so zu filtern, dass sie die Folder Objekte von Interesse zu einem bestimmten Zeitpunkt enthalten. Um dies zu tun, müssen Sie einen Verweis auf den aktuellen übergeordneten Ordner im View-Controller speichern:

@property (readwrite, strong) Folder *parentFolder; 

Wenn Sie an der Wurzel des Baumes sind, dann wird dieser nil sein, sonst wird es haben ein Verweis auf den aktuellen Ordner, dessen Inhalt angezeigt wird.

Dann diese Eigenschaft in einem Prädikat verwenden:

NSFetchRequest *fetchRequest = ... 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent = %@", self.parentFolder]; 
[fetchRequest setPredicate:predicate]; 

Wenn Sie an der Wurzel sind, dann wird dies nur Instanzen von Folder zu wählen, wo parent sind nil (das heißt nur Objekte Root-Ebene). Auf jeder anderen Ebene wählt es nur Folders aus, wobei parent unabhängig vom aktuellen übergeordneten Ordner ist.

Als Randbemerkung, Code in Ihrer Probe, dann ist es nicht notwendig, subFolder1.parentundroot1.children einzustellen. Core Data Inverse Relationship Management bedeutet, dass Sie dies nur auf einer Seite der Beziehung tun müssen. Es tut nichts weh, beides zu tun (abgesehen von einem sehr kleinen Performance-Hit), aber es dient auch keinem Zweck.

+0

Danke für die Info! Funktioniert wie ein Charme :) – Lapidus

+0

Wenn ich Dateien zu diesen Ordnern hinzufügen würde, indem Sie eine Eins-zu-viele-Beziehung hinzufügen Folder.files - >> File.inFolder Und beide Entitäten Ordner und Datei hatte und Int-Attribut namens 'bestellen' Wie würde Ich kann sowohl Dateien als auch Ordner sortieren. – Lapidus

+0

Schauen Sie in 'NSSortDescriptor'. Wenn Ihre Sortierung alphabetisch ist, benötigen Sie kein Attribut 'order'. –