13 Stimmen

Ist Core Data auch für schreibgeschützte Daten nützlich?

Ich erstelle eine iPhone App und frage mich, ob Core Data für schreibgeschützte Daten besser geeignet ist als eine SQLite Datenbank. Ich habe das Gefühl, dass die SQLite DB die bessere Wahl ist, ist das richtig? Kann ich den Core Data-Speicher sogar vorab befüllen?

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

Soll oder kann ich in diesem Fall Kerndaten verwenden?

13voto

Brad Larson Punkte 169275

Wenn Sie Ihre schreibgeschützten Daten in einer Tabellensicht anzeigen wollen, kann die Verwendung von Core Data gegenüber SQLite allein aufgrund von NSFetchedResultsController erhebliche Vorteile bieten. Diese Komfortklasse macht die Anzeige von Datenbankelementen in einer Tabellendarstellung extrem einfach und kann das Abrufen von Daten in Stapeln für Sie erledigen. Mit dem Batched Fetching können Sie nur die Informationen laden, die Sie in diesem Moment auf dem Bildschirm benötigen, was die Ladezeit und den Speicherverbrauch für alle außer den kleinsten Datensätzen drastisch verbessert.

Aus diesem Grund verwende ich Core Data für schreibgeschützte Informationen, die ich im Bundle meiner Anwendung ausliefere, sowie für die Tatsache, dass ich ein Datenmodell mit der beschreibbaren Datenbank gemeinsam nutzen kann, die in den Anwendungsdaten des Benutzers gespeichert ist. Ich empfehle die Verwendung von Core Data, es sei denn, Sie müssen unbedingt iPhone OS 2.x-Geräte ansprechen.

10voto

Rose Perrone Punkte 58235

Hier ist eine einfache Möglichkeit, den Core Data-Speicher mit Hilfe von Plists vorzuladen.

Erstellen Sie eine Eigenschaftsliste, die eine Reihe von Wörterbüchern enthält. Die Schlüssel der einzelnen Wörterbücher müssen den Schlüsseln des verwalteten Objekts entsprechen.

alt text

Rufen Sie diese Methode dann beim ersten Start der Anwendung auf:

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

Rufen Sie an. loadDataFromPropertyList wenn die Anwendung zum ersten Mal gestartet wird, indem Sie den folgenden Code in die Implementierung von 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];
}

2voto

Sixten Otto Punkte 14771

Sie sind definitiv puede einen vorgefüllten Core-Data-Speicher in Ihre Anwendung einbinden, genauso wie Sie eine vorgefüllte SQLite-Datenbank oder eine große Plist mit all Ihren Daten einbinden könnten (obwohl das in diesem Fall schlecht passt) oder was auch immer.

Core Data ist schön, weil es alle nativen Cocoa ist, es behandelt alle das Laden von der DB in native Objekte, es wurde rücksichtslos optimiert, und so weiter. Aber es gibt auch eine Menge Code, der Dinge tut, die Sie nicht interessieren: Handhabung von Revisionen, Speichern von Änderungen, Rückgängig- und Wiederherstellungsunterstützung usw. Es gibt also keine eindeutig richtige Antwort auf die eine oder andere Weise.

Vieles wird davon abhängen, wie gut Sie mit Core Data und den Alternativen zurechtkommen. Sind Sie zufrieden mit der SQLite-API (oder einer der vielen anderen Kakao-Verpackungen ), um Ihre Daten zu erhalten? Wenn ja, könnte das einfacher sein. Wenn Core Data das ORM für Sie übernimmt, wäre das ein großer Gewinn, dann sollten Sie diesen Weg gehen. Andererseits verwenden komplexe Abfragen mit Core Data die Prädikat-APIs, die komplexer sein können als die Verwendung von reinem SQL mit SQLite. Diese Art von Dingen.

2voto

coneybeare Punkte 32926

Je nachdem, wie relational sie sind, ist es besser, die schreibgeschützten Daten aus einer Liste zu lesen. Plist's sind einfach zu laden/speichern (sie werden zu NSDictionaries) und sind wahrscheinlich einfacher zu bearbeiten

-8voto

Azeem.Butt Punkte 6025

Core Data verwendet SQLite (neben anderen Optionen), daher ist Ihre Frage nicht ganz richtig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X