CoreData vs Realm (in Swift)

Nachdem ich von CoreData zu Realm gewechselt war, hielt ich es für nützlich, die wichtigsten Unterschiede zu beachten.

Erstens verwende ich nicht die Cloud-Funktionen von Realm und werde wahrscheinlich iCloud zum Synchronisieren von Daten verwenden. Ich wähle kostenlose Dienste und Realm kann kostenlos verwendet werden, wenn Sie keine Synchronisierung über die Cloud-Plattform benötigen.

Sowohl CoreData als auch Realm verwenden Objective-C-basierte Klassen, um reale Objekte zu instanziieren, die von einer Art Geschäft unterstützt werden. CoreData verwendet standardmäßig eine sqllite-Datenbank. Daher benötigen Sie einige sqllite-Tools, um die Datenbank manuell anzuzeigen und zu bearbeiten. Realm verwendet ein proprietäres Format, im Mac App Store steht jedoch ein kostenloser Browser zum Anzeigen und Bearbeiten der Datenbank zur Verfügung.

Out-of-the-Box-Realm ist viel einfacher zu verstehen als CoreData. CoreData verwaltet Objekte explizit in einem ManagedObjectContext, den Sie speichern müssen, um Änderungen beizubehalten, während Realm alle Änderungen innerhalb von Schreibblöcken sofort beibehält. Um CoreData verwenden zu können, benötigen Sie ein tiefes Verständnis der API, die sich über eine Reihe von verwandten Klassen erstreckt. Sie können mit Realm fast direkt hineinspringen. Ein wesentlicher Vorteil ist, dass Sie die Datenbank überprüfen können, um festzustellen, wie sie aussieht, da die Änderungen von Realm sofort bestehen bleiben, wenn Ihre App abstürzt oder Sie den Simulator beenden. Wenn Sie mit CoreData den Emulator stoppen, ohne zuvor den Kontext zu speichern, verlieren Sie an diesem Punkt den Datenbankstatus. Das ist fast genug, um mich dazu zu bringen, bei Realm zu bleiben. Es mag weniger effizient sein und Sie könnten einfach den Kontext für jede Änderung in CoreData speichern, aber es fühlt sich an, als würden Sie gegen die API arbeiten, wenn Sie anfangen, solche Dinge zu tun. Es ist zu beachten, dass Realm-Blöcke beim Schreiben und Zugreifen eine Thread-Ausnahme verursachen, wenn sie nicht auf dem Haupt-Thread ausgeführt werden.

Das Erstellen eines Schemas ist ebenfalls unterschiedlich. Mit CoreData erstellen Sie ein Modell in XCode, das die Klassen generiert, mit denen die Daten in Objekte eingebunden werden. Auch hier ist Realm einfacher, da Sie lediglich von Object erben und Eigenschaften markieren müssen, die Sie als @objc dynamic speichern möchten. Es gibt eine Reihe von Funktionen, die Sie überschreiben können, um die Art und Weise anzupassen, in der Ihre Objekte erhalten bleiben usw. Ich mag die visuelle Darstellung des Modells in XCode und es ist wohl einfacher, mit Eins-zu-Viele- und Viele-zu-Viele-Beziehungen zu arbeiten der XCode-Modelleditor als es ist, die LinkingObjects () -Funktionalität in Realm zu verwenden.

Ich stelle mir eine Realm-Klasse als Tabellendefinition vor und Sie können leicht ein Live-Resultset erhalten, indem Sie realm.objects (MyObject.self) aufrufen, das weiterhin ausgelöst wird, wenn Zeilen hinzugefügt, gelöscht oder aktualisiert werden. Sie können der Ergebnismenge Prädikate hinzufügen, damit Sie vorgefilterte und sortierte Ergebnisse erhalten, oder Sie können sie einem Array zuordnen. In CoreData können Sie ähnliche Dinge tun, aber auch hier ist die API in Realm einfacher.

Mit CoreData können Sie festlegen, wie mit Nullreferenzen umgegangen werden soll. Dies ist praktisch, wenn Sie möchten, dass Löschungen kaskadiert werden und Ihre Datenbank nicht mit Nullen oder Verweisen auf nicht mehr vorhandene Objekte gefüllt bleibt. Dies soll in einer neuen Version erscheinen, aber bis dahin habe ich eine Cascading Deletion API für Realm geschrieben, die ich zu gegebener Zeit veröffentlichen werde.

Nachdem ich genug über CoreData gelernt hatte, um es verwenden zu können, wollte ich nur ungern auf etwas anderes als die relative Einfachheit von Realm und die Tatsache umsteigen, dass es beim wiederholten Starten und Beenden des Simulators ein bisschen freundlicher ist Das heißt, ich würde Realm über CoreData empfehlen.