2009-10-28 9 views
12

Ich erstelle eine iPhone App und frage mich, ob Core Data für readonly Daten besser ist als eine SQLite Datenbank. Es fühlt sich an, als wäre die SQLite DB die bessere Wahl, oder? Kann ich den Core Data-Speicher sogar vorfüllen?Sind Core-Daten auch für readonly Daten nützlich?

Im Grunde brauche ich 3 Tabellen mit einer Menge (bis zu 3000) von Entitäten. Ich möchte dann die Daten in TableViews auflisten, danach suchen oder Dinge für andere Zwecke laden.

Sollte oder kann ich Core Data in diesem Fall verwenden?

Antwort

13

Wenn Sie Ihre schreibgeschützten Daten in einer Tabellenansicht anzeigen, kann die einfache Verwendung von Core Data gegenüber SQLite erhebliche Vorteile bieten aufgrund von NSFetchedResultsController. Diese Convenience-Klasse macht es extrem einfach, Datenbankelemente in einer Tabellenansicht anzuzeigen, und sie kann das Batch-Holen für Sie übernehmen. Mit dem Batch-Abruf können Sie nur die Informationen laden, die Sie gerade benötigen, und die Ladezeit und den Speicherverbrauch für alle bis auf die kleinsten Datensätze erheblich verbessern.

Ich verwende Core Data für schreibgeschützte Informationen, die ich aus diesem Grund im Paket meiner Anwendung ausliege, zusammen mit der Tatsache, dass ich ein Datenmodell mit der in den Anwendungsdaten des Benutzers gespeicherten beschreibbaren Datenbank teilen kann. Meine Empfehlung ist, mit Core-Daten zu gehen, es sei denn, Sie müssen unbedingt auf iPhone OS 2.x-Geräte abzielen.

-8

Core Data verwendet SQLite (neben anderen Optionen), so dass Ihre Frage etwas fehlerhaft ist.

+4

Ich würde es nicht als eine fehlerhafte Frage betrachten. Während CoreData SQLite für * zugrunde liegenden * Speicher verwendet, haben Sie keine Schnittstelle zu SQLite selbst. Stattdessen leitet sich die Macht von CoreData von seinen Klassen und Methoden ab. Zum Beispiel hilft 'NSFetchedResultsController', wenn es mit einem' UITableView' verwendet wird, beim effizienten Lesen von Daten von der Platte, wie es benötigt wird, und bei der entsprechenden Speicherverwaltung. Sie müssen dies im Wesentlichen selbst tun, wenn Sie SQLite verwenden. – jbrennan

+0

Wohin geht die SQLite API, wenn Sie Core Data verwenden? Soweit ich das beurteilen kann, ist es immer noch da. –

+1

Es ist mir egal, ob ich auf beide gleichzeitig zugreifen kann (wahrscheinlich eine schlechte Idee, wenn Core Data Ihre Objekte verwaltet). Ich möchte einen benutzen und muss wissen, welcher der beste ist. – Christian

2

Sie auf jeden Fall kann Schiff eine vorgefüllte Core Data Store in Ihrer App, wie Sie könnte eine vorgefüllte SQLite-Datenbank oder ein großer plist mit all Ihren Daten (obwohl das klingt wie eine schlechte Passform für dieser Fall) oder was auch immer.

Core Data ist nett, weil es alles native Cocoa ist, behandelt es alle das Laden von der DB in native Objekte, es wurde gnadenlos optimiert, und so weiter. Aber es gibt auch eine Menge Code, um Dinge zu tun, die dir egal sind: Revisionen bearbeiten, Änderungen speichern, Support rückgängig machen und wiederherstellen usw. Also gibt es nicht wirklich eine offensichtlich richtige Antwort in der einen oder anderen Richtung.

Eine Menge hängt von Ihrem Komfort mit Core Data und den Alternativen ab. Sind Sie zufrieden mit der SQLite API (oder einer der vielen Cocoa wrappers), um Ihre Daten zu bekommen? Wenn ja, dann könnte das einfacher sein. Wenn Core-Daten das ORM für Sie wären, wäre das ein großer Gewinn. Auf der anderen Seite verwenden komplexe Abfragen mit Core Data die Prädikat-APIs, die komplexer sein können als die Verwendung von Bare SQL mit SQLite. Derartiges.

+0

Ich habe die Information hinzugefügt, dass es bis zu 3000 Datensätze in einer der Tabellen sein kann. Wenn ich mich leicht selbst entscheiden könnte, muss ich hier nicht fragen. Aber zu wissen, dass es keine großen Nachteile gibt, hilft. – Christian

2

Je nachdem, wie relational sie sind, könnten Sie die read-only Daten von einem PLIST besser lesen. Plists sind einfach zu laden/speichern (sie werden zu NSDictionaries) und sind wahrscheinlich einfacher zu bearbeiten

+0

Ah, habe nicht daran gedacht. Sie sind relational. Es ist wie "eine Station gehört zu einer Route, die zu einem Verkehrsmittel gehört". Das ist nicht optimal für Plists, oder? – Christian

+0

Hängt davon ab. Ist es streng hierarchisch, oder gibt es viele-zu-viele-Beziehungen? Ein Plist macht den ersten gut, aber letzteres ist schwieriger. –

+0

Ja, es gibt eine Viele-zu-Viele-Beziehung. Also gehe ich besser nicht mit Plisten. Danke vielmals! – Christian

10

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