2009-06-30 3 views
7

Ich implementiere eine navigationsbasierte Anwendung. Der Benutzer führt einen Drilldown zu dem Knoten von Interesse durch. Ich verwende Core Data, hauptsächlich weil ich es ausprobieren möchte. Wie lade ich die Datenbank zunächst? Sollte ich benutzerdefinierten Code schreiben, der die Datenbank anfänglich lädt, oder gibt es ein Tool, um es für mich zu tun?Daten in das Core-Datenschema laden

+0

Hey Andrei - sprichst du über das Auffüllen deiner SQLLite-Datenbank mit Informationen oder das Laden des Kerndatenmodells Sobald die App läuft? –

Antwort

3

Es gibt keine automatische (d. H. Integrierte) Methode zum Importieren von Daten in einen Core Data-Kontext.

Ich vermute, dass dies daran liegt, dass Core Data wirklich ein Objekt Graph Management Framework ist (das zufälligerweise in der Lage ist, dieses Objektdiagramm auf Platte zu halten) und die Zuordnung zwischen Daten und Objektinstanzen hängt vom Schema ab benötigen mindestens einen Code). Wenn Sie die Daten bereits in einem anderen Format haben, sollten Sie den Abschnitt des Core Data Programming Guide unter importing data into a Core Data context lesen. Wenn Sie die Daten nicht bereits in einem anderen Format haben, müssen Sie Code in beide Richtungen schreiben (um ein Zwischenformat zu erzeugen oder den Kontext direkt zu füllen).

Schließlich, obwohl es nicht wirklich eine öffentliche API ist, ist das Core Data XML-Format ziemlich einfach mit der Hand zu arbeiten oder eine beliebige Anzahl von XML-basierten Tools zu verwenden. Abhängig von der Komplexität Ihrer Daten können Sie das XML-Schema möglicherweise so weit zurückentwickeln, dass ein XML-gestützter persistenter Speicher generiert wird. Sie könnten diesen Speicher dann in einen persistenten SQLite-Speicher migrieren, und Sie sind auf dem Weg.

0

Derzeit, soweit ich weiß, müssen Sie benutzerdefinierten Code schreiben, um die Datenbank zu füllen.

Dies scheint wie ein Nachteil, ich würde wirklich gerne ein Werkzeug für Batch (Shell) Vor-Population von Datenquellen sehen, die von CoreData verwendet werden sollen.

17

Hier ist eine einfache Möglichkeit, den Core Data Store mit plists vorzuladen.

Erstellen Sie eine Eigenschaftsliste mit einem Array von Wörterbüchern. Stellen Sie sicher, dass die Schlüssel jedes Wörterbuchs den Schlüsseln Ihres verwalteten Objekts entsprechen.

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

Dann rufen Sie diese Methode zum ersten Mal die App startet:

- (void)loadDataFromPropertyList { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"]; 
    NSArray *items = [NSArray arrayWithContentsOfFile:path]; 

    NSManagedObjectContext *ctx = self.managedObjectContext; 

    for (NSDictionary *dict in items) { 
     NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx]; 
     [m setValuesForKeysWithDictionary:dict]; 
    } 

    NSError *err = nil; 
    [ctx save:&err]; 

    if (err != nil) { 
     NSLog(@"error saving managed object context: %@", err); 
    } 
} 

Anruf loadDataFromPropertyList das erste Mal die App startet, indem Sie den folgenden Code in der Implementierung von application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions einschließlich:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if (![defaults objectForKey:@"firstRun"]) 
{ 
    [defaults setObject:[NSDate date] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadDataFromPropertyList]; 
} 
+0

Danke dafür, es ist eine Weile her, seit ich das verwendet habe, bekomme ich einen SIGBRT Fehler, ich kann mich nicht erinnern, was ich löschen soll, wenn ich das nächste Mal laden möchte. Ideen? –