2009-06-30 4 views
7

Sto implementando un'applicazione basata sulla navigazione. L'utente eseguirà il drill down sul nodo di interesse. Sto usando Core Data, soprattutto perché voglio provarlo. Come carico inizialmente il database? Devo scrivere un codice personalizzato che carichi inizialmente il database, o c'è qualche strumento per farlo?Carica dati nello schema dei dati principali

+0

Hey Andrei - stai parlando di compilare il tuo database SQLLite con informazioni o di caricare effettivamente il modello di dati di base una volta che l'app è in esecuzione? –

risposta

3

Non esiste un metodo automatico (cioè integrato) per l'importazione di dati in un contesto di dati di base.

Ho il sospetto che ciò sia dovuto al fatto che i Core Data sono in realtà un framework di gestione del grafo degli oggetti (che capita di essere in grado di mantenere il grafo degli oggetti sul disco) e il mapping tra i dati e le istanze degli oggetti dipende dallo schema (e così sarà richiede almeno un po 'di codice).

Se i dati sono già in un altro formato, è necessario leggere la sezione della Guida alla programmazione dei dati principali su importing data into a Core Data context. Se non si dispone già dei dati in un altro formato, sarà necessario scrivere il codice in entrambi i modi (per generare un formato intermedio o per popolare direttamente il contesto).

Infine, anche se non è realmente un'API pubblica, il formato XML di Core Data è abbastanza facile da lavorare a mano o utilizzando un numero qualsiasi di strumenti basati su XML. A seconda della complessità dei tuoi dati, potresti essere in grado di decodificare lo schema XML in modo sufficiente per generare un archivio persistente con supporto XML. È quindi possibile migrare questo negozio a un archivio persistente di SQLite e si è sulla buona strada.

0

Attualmente, per quanto ne so, è necessario scrivere codice personalizzato per popolare il database.

Questo sembra un aspetto negativo, mi piacerebbe davvero vedere uno strumento per la pre-compilazione batch (shell) di origini dati destinate ad essere utilizzate da CoreData.

17

Ecco un modo semplice per eseguire il precaricamento dell'archivio dei dati principali utilizzando gli elenchi.

Creare un elenco di proprietà contenente una matrice di dizionari. Rendi le chiavi di ciascun dizionario corrispondenti alle chiavi del tuo oggetto gestito.

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

Poi, chiamare questo metodo per la prima volta l'applicazione lancia:

- (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); 
    } 
} 

chiamata loadDataFromPropertyList la prima volta i lanci app includendo il seguente codice nella realizzazione di application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:

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

Grazie per questo, è passato un po 'di tempo da quando l'ho usato, ricevo un errore SIGBRT, non riesco a ricordare cosa dovrei eliminare la prossima volta che lo voglio caricare. Idee? –