Domanda

Sto creando un'app per iPhone e mi chiedo se Core Data sia migliore per i dati di sola lettura rispetto a un database SQLite. Sembra che il DB SQLite sia la scelta migliore, giusto? Posso anche pre-riempire l'archiviazione dei dati principali?

Fondamentalmente, ho bisogno di 3 tabelle con un gruppo (fino a 3000) di entità ciascuna. Voglio quindi elencare i dati in TableViews, cercarli o caricare oggetti per altri scopi.

In questo caso dovrei o posso utilizzare i dati di base?

È stato utile?

Soluzione

Se visualizzerai i tuoi dati di sola lettura in una vista tabella, ci possono essere vantaggi significativi nell'utilizzo di Core Data su SQLite semplicemente grazie a NSFetchedResultsController. Questa classe di convenienza rende estremamente semplice la visualizzazione di elementi di database in una vista tabella e può gestire il recupero in batch. Il recupero in batch ti consente di caricare solo le informazioni necessarie sullo schermo in quel momento, migliorando notevolmente il tempo di caricamento e l'utilizzo della memoria per tutti tranne i set di dati più piccoli.

Uso i Core Data per le informazioni di sola lettura che invio nel bundle della mia applicazione per questo motivo, insieme al fatto che posso condividere un modello di dati con il database scrivibile archiviato nei dati dell'applicazione dell'utente. La mia raccomandazione è di utilizzare Core Data a meno che non sia assolutamente necessario indirizzare i dispositivi iPhone OS 2.x.

Altri suggerimenti

Ecco un modo semplice per precaricare l'archivio dei dati di base utilizzando i plists.

Crea un elenco di proprietà contenente una matrice di dizionari. Rendi le chiavi di ciascun dizionario corrispondenti alle chiavi dell'oggetto gestito.

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

Quindi, chiama questo metodo al primo avvio dell'app:

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

Chiama loadDataFromPropertyList la prima volta che l'app viene avviata includendo il seguente codice nell'implementazione dell'applicazione : (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions :

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

A seconda di quanto siano relazionali, potresti stare meglio leggendo i dati di sola lettura da un plist. I Plist sono facili da caricare / salvare (si trasformano in NSDictionaries) e sono probabilmente più facili da modificare

Sicuramente puoi spedire un archivio di dati core pre-compilato nella tua app, proprio come potresti un database SQLite pre-compilato o una grande lista di tutti i tuoi dati (anche se sembra una scelta sbagliata per questo caso) o qualsiasi altra cosa.

I dati di base sono belli perché sono tutti Cocoa nativi, gestiscono tutto il caricamento dal DB in oggetti nativi, sono stati ottimizzati spietatamente e così via. Ma c'è anche un sacco di codice lì per fare cose che non ti interessano: gestire le revisioni, salvare le modifiche, annullare e ripetere il supporto, ecc. Quindi non c'è davvero una risposta ovviamente giusta in un modo o nell'altro.

Molto dipenderà dal tuo livello di comfort sia con i Core Data sia con le alternative. Sei felice di avere a che fare con l'API di SQLite (o una delle tante Wrapper di cacao ) per ottenere i tuoi dati? In tal caso, potrebbe essere più semplice. Se avere Core Data a fare l'ORM per te sarebbe una grande vittoria, allora vai in quel modo. D'altra parte, le query complesse con Core Data utilizzano le API del predicato, che potrebbero essere più complesse rispetto all'utilizzo di SQL nudo con SQLite. Questo genere di cose.

Core Data utilizza SQLite (tra le altre opzioni), quindi la tua domanda è alquanto imperfetta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top