webentwicklung-frage-antwort-db.com.de

Core Data VS SQLite oder FMDB ....?

Das sieht vielleicht wie ein doppelter Thread aus, aber meine Frage ist, dass ich viele Fragen wie .. Core Data vs SQLite 3 und andere gelesen habe, aber diese sind 2-3 Jahre alt. Ich habe auch gelesen, dass FMDB entwickelt wurde, da Core-Daten unter iOS nicht unterstützt wurden und daher nicht mehr verwendet werden sollten. Und andererseits habe ich gelesen, dass man Kerndaten nicht als Datenbank verwenden sollte.

Ich bin also ernsthaft verwirrt, ob ich Kerndaten für die Objektspeicherung verwenden soll oder nicht . Ich meine, auf welcher Basis soll ich mich für eine entscheiden? Gibt es Richtlinien, die von Apple oder einer anderen Person zur Verfügung gestellt werden? Oder ist es etwas, das mir mit der Zeit einfallen wird?

36

Ankit,

Hier ist das Tl; dr Skinny: Verwenden Sie Core Data.

Hier ist die lange Form:

Sie können viele Kriterien verwenden, um zwischen Core Data, einem ORM (FMDB) oder direkten sqlite-Aufrufen zu wählen. Die tatsächlichen Kosten dieser Wahl entstehen jedoch aus der Zeit, in der sie verwendet werden, sowie der Unterstützung durch Apple und der Nutzung anderer Projekte. (RESTKit, das REST -Dienste auf Core Data abbildet, ist heutzutage sehr beliebt.)

Daher wird ein großer Prozentsatz der Zeit, z. B. 90 +% (eine erfasste Statistik), unter iOS die Antwort auf Core Data sein. Warum? Wenn Sie den Dreh raus haben und ein paar kleine Hilfsmethoden entwickeln, bleiben Sie in Core Data in einer konsistenten Computerwelt - dem Objective-C-Objektgraph. In Core Data erfahren Sie, wie Sie eine dynamische Sprache verwenden, die allen anderen Aspekten Ihrer iOS-Programmierung hilft. Daher sind Sie produktiver. Kämpfe nicht gegen den Rahmen.

Wenn Sie eine große, komplexe SQLite-Datenbank und ein großes Schema aus einer anderen App übernehmen, ist die Verwendung von FMDB oder SQLite möglicherweise kostengünstig. Aber ich bezweifle es. Ihre Zeit beim Schreiben einer einfachen Mac-basierten Befehlszeilen-App zum Migrieren der Datenbank in eine Core Data-Datenbank ist eine begrenzte und einfache Aufgabe. Es ist fast garantiert, dass Sie die meisten Geschäftslogiken in Objective-C neu schreiben müssen. (Ja, C++ und Objective-C++ sind beides gute Technologien. Wurde Ihre Datenbankgeschäftslogik wirklich so eingestellt, dass sie auf einem Gerät mit beschränktem Speicher funktioniert? Ich glaube nicht.)

Core Data erhält einen Rausschmiss in Sachen Leistung. Es ist wirklich ziemlich schnell. Sie müssen es nur anders verwenden als eine DB. Insbesondere holen Sie Daten fast immer aus dem Speicher ab und verfeinern sie dann mithilfe von Prädikaten direkt auf den verschiedenen Sets und Arrays. Bei iOS-Geräten, bei denen der Flash überraschend langsam ist, ist diese Over-Fetch-Strategie besonders effektiv. Sie haben tatsächlich eine Menge RAM auf diesen Geräten, um die Leistung zu steigern. (Ja, ich weiß, dass dies ein offensichtlicher Widerspruch zu meinem oben genannten Klopfen bei der tragbaren Geschäftslogik ist. In Wirklichkeit hat der von einer Desktop- oder Serverumgebung portierte Code jedoch so viele implizite Annahmen über die Geschwindigkeit der Festplatte, die Menge des Speichers und die Realität von a VM mit einem Backing-Store funktioniert es bei einem batteriebetriebenen, speicherbegrenzten Gerät mit einem funky Speichermodell einfach nicht. [Bei Android-Geräten funktioniert es auch nicht sehr gut.]) Denormalisieren Sie Ihre Daten auch, um die Anzeige in verschiedenen iOS- und Mac OS X-Benutzeroberflächen-Widgets zu vereinfachen. Es gibt einige Anwendungen, bei denen Core Data langsamer ist als eine entsprechende SQLite-Datenbank. Diese wurden an anderer Stelle beschrieben. Der eine Hauptanspruch besteht darin, dass Aufgaben, bei denen IDs von Upstream-Datenbanken definiert werden, die Kernleistung von Core Data erfüllen. Sie kann jedoch durch vernünftiges Indexieren und Überholen etwas abgemildert werden.

Was bei mobilen Geräten auch zu beachten ist, ist, dass die Datenbankgröße, da es sich um mobile Geräte an den Blättern des Internets handelt, im Allgemeinen von geringer Größe ist. Daher ist die Leistung einfacher zu erreichen. Viele Lektionen aus der Welt der Server gelten möglicherweise nicht für diese mobile, batteriebetriebene Welt.

Mit anderen Worten, Sie mussten "All-in" gehen, um Objective-C unter iOS/Mac OS X zu verwenden. Durch die Verwendung von Core Data werden Sie auch einige wichtige Produktivitätsvorteile erzielen.

Andrew

45
adonoho

Ich habe vor kurzem selbst diese Reise angetreten und am Ende alle drei ausprobiert. Folgendes habe ich gelernt:

  • Raw sqlite3
    • Low-Level-Zugriff auf die Datenbank. Keine Abstraktionen. Sehr ausführlich - es erfordert viel Code, um sehr einfache Dinge zu tun.
  • Kerndatei
    • MUSS die generierte Datenbank von Apple verwenden. Nützlich für die iCloud-Synchronisation und die einfache Verwaltung von Daten, die nur für iOS gelten. Der direkte Zugriff auf die Datenbank ist schwierig und gefährlich und sollte nicht für plattformübergreifende Datenbanken verwendet werden. Trotzdem dauert es ziemlich viel Code, um einfache Dinge zu tun.
  • FMDB
    • Hochrangig, sehr abstraktionsfreundlich, aber nicht gezwungen. Erhalten Sie weiterhin vollen Zugriff auf die Datenbank, wenn Sie sie benötigen. Stellt eine NSDictionary des Ergebnisses bereit, wobei jedes Element automatisch in die veränderbare Variante des richtigen Datentyps umgewandelt wird (z. B. werden Textspalten als NSMutableString zurückgegeben). Am Ende baute ich eine sehr einfache Wrapper-Klasse auf, um sie noch mehr zu abstrahieren. Deshalb habe ich eine Hilfsklasse mit statischen Funktionen wie selectAllFrom:(NSString *)table where:(NSDictionary *)conditions, die eine NSArray von NSDictionary-Objekten zurückgibt. Es ist fantastisch, Dinge wie NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}]; zu tun.

Während Core Data für einfache iOS-Apps nützlich sein kann, sollte jeder, der an plattformübergreifenden Datenbanken interessiert ist, weit davon entfernt sein - Apple hat kein Interesse daran, dies einfach zu machen, und das zeigt.


TL; DR:

  • Verwenden Sie kein rohes sqlite3, es sei denn, Sie machen etwas extrem Triviales.
  • Core Data eignet sich gut für einfache iOS-Daten, wenn Sie mit dem Sperren dieser Daten vertraut sind.
  • Wenn Sie die vollständige Kontrolle über die Datenbank haben möchten und nichts Triviales tun oder Ihre App für mehrere Plattformen erstellen, ist FMDB definitiv der richtige Weg.
38
alexwebb2

Ich verwende FMDB für alle meine Projekte, bei denen "INSERTs" häufig verwendet wird und FMDB nicht veraltet ist. Das letzte Commit für Github war letzten November. Wenn Sie mit SQL arbeiten, empfehle ich Ihnen, FMDB zu verwenden.

Core Data passt zu 95% aller Projekte, aber wenn es um die Optimierung geht, läuft eine Wand. Wenn Sie die Vorteile von Core Data (OOP, ...) nutzen möchten, verwenden Sie sie. Wenn Sie eine Menge Löschungen mit "WHERE" Benutzer Sqlite (FMDB) haben

Dieser POST erklärt die off und top Seite für Core Date vs. Sqlite (FMDB)

8
CarlJ

CoreData ist nicht nur eine Abstraktion einer SQL-Datenbank. CoreData übernimmt auch die Objektgraphverwaltung. CoreData kann Dinge, die FMDB einfach nicht kann.

Wie immer: Das hängt wirklich von Ihrem Anwendungsfall ab. In 99% der Fälle ist CoreData jedoch die richtige Wahl.

Wenn Leistung von entscheidender Bedeutung ist, müssen Sie immer noch wissen, wie eine Datenbank funktioniert. CoreData kann diese Leistung erbringen, wenn Sie es richtig einsetzen. Das Lernen dauert jedoch einige Zeit. Es gibt viele Dinge, die in CoreData trivial sind, die in FMDB sehr komplex wären.

6
Daniel Eggert

Als neuer SQL-Typ werde ich meine zwei Cent einwerfen:

In Core Data haben Sie etwas "Boilerplate" -Code, den Sie eingeben müssen, bevor Sie Ihre Datenbank tatsächlich verwenden können. Ihre App benötigt mindestens eine davon:

  1. Ein dauerhafter Filialkoordinator
  2. Ein verwalteter Objektkontext
  3. Ein verwaltetes Objekt Dies korreliert mit einer Entität, die einer Tabelle entspricht, wenn Sie eine SQLite-Datenbank verwenden.

Um das Framework voll ausnutzen zu können, müssen Sie wissen, welche Rolle diese Objekte bei der Verwaltung Ihrer Daten spielen.

Auf der anderen Seite haben wir SQLite, was meiner Meinung nach viel einfacher zu verstehen ist. Um zu beginnen, benötigen Sie:

  1. Eine Datenbank
  2. Eine Tabelle oder mehr (abhängig von Ihren Daten)
  3. SQL-Kenntnisse - eine flexible Sprache mit einer vereinfachten Syntax (SELECT-Abfragen bieten mehr als das, was Sie ursprünglich für richtig halten)
  4. Ein Objekt, über das Ihre App mit SQLite kommuniziert. 
2
moonman239

Kerndaten sind nur eine Objektzusammenfassung der SQLite3-Datenbank. Das bedeutet, dass Sie persistente Objekte für Standard-Datenbankvorgänge problemlos verwalten können. Sie können auch in einem Transaktionsmodus arbeiten und die Struktur Ihrer Kerndatenbank in XCode entwerfen, indem Sie Modelle erstellen.

Wenn Sie Ihre SQLite3-Datenbank oder persistente Methoden nicht manuell erstellen möchten, verwenden Sie Core Data.

0
Stefan Ticu