CoreData vs Realm (dans Swift)

Après avoir passé de CoreData à Realm, j’ai pensé qu’il serait utile de noter les principales différences.

Tout d’abord, je n’utilise pas les fonctionnalités cloud de Realm et utilisera probablement iCloud pour synchroniser les données. Je choisis des services gratuits et Realm est gratuit si vous n’avez pas besoin de synchroniser via leur plate-forme cloud.

CoreData et Realm utilisent tous deux des classes basées sur Objective-C pour instancier des objets réels sauvegardés par un type de magasin. CoreData utilise une base de données sqllite par défaut, vous aurez donc besoin de quelques outils sqllite pour afficher et modifier la base de données à la main. Realm utilise un format propriétaire, mais un navigateur est disponible gratuitement sur le Mac App Store pour afficher et modifier la base de données.

Il est beaucoup plus facile de comprendre que CoreData. CoreData gère les objets explicitement dans un ManagedObjectContext que vous devez enregistrer pour conserver les modifications, tandis que Realm conserve toutes les modifications immédiatement dans les blocs d'écriture. Pour utiliser CoreData, vous devez avoir une connaissance approfondie de l'API, qui est répartie sur un certain nombre de classes liées. Vous pouvez presque sauter directement avec Realm. L’un des avantages majeurs que j’ai constaté est que, étant donné que les modifications apportées par Realm persistent immédiatement, si votre application se bloque ou si vous quittez le simulateur, vous pouvez inspecter la base de données pour voir à quoi elle ressemble. À l'aide de CoreData, arrêter simplement l'émulateur sans d'abord enregistrer le contexte signifie que vous perdez l'état de la base de données à ce stade. Cela suffit presque à lui seul pour me faire rester avec Realm. Cela peut sembler moins efficace et vous pourriez simplement sauvegarder le contexte à chaque changement de CoreData, mais vous avez l’impression que vous travaillez contre l’API lorsque vous commencez à faire ce genre de choses. Il est utile de rappeler que les blocs de domaine lors de l'écriture et de l'accès provoquent une exception de thread s'ils ne sont pas exécutés sur le thread principal.

La création d'un schéma est également différente, à l'aide de CoreData, vous créez un modèle dans XCode qui génère les classes utilisées pour instatntiate les données dans des objets. Encore une fois, Realm est plus simple en ce sens qu'il vous suffit d'hériter d'Object et de marquer les propriétés que vous souhaitez stocker en tant que @objc dynamic. Vous pouvez remplacer certaines fonctions pour personnaliser la manière dont vos objets persistent, etc. J'aime la représentation visuelle du modèle dans XCode. Il est sans doute plus facile de travailler avec des relations un à plusieurs et plusieurs à plusieurs avec l'éditeur de modèle XCode que d'utiliser la fonctionnalité LinkingObjects () dans Realm.

Je pense à une classe de domaine en tant que définition de table et vous pouvez facilement obtenir un ensemble de résultats en direct en appelant realm.objects (MyObject.self), qui continuera à se déclencher à mesure que des lignes sont ajoutées, supprimées ou mises à jour. Vous pouvez ajouter des prédicats à l'ensemble de résultats afin d'obtenir des résultats triés et pré-filtrés ou les mapper à un tableau. Dans CoreData, vous pouvez faire des choses similaires, mais là encore, l’API de Realm est plus simple.

CoreData vous permet de définir comment traiter les références null, ce qui est pratique si vous souhaitez que les suppressions soient en cascade et ne laissez pas votre base de données remplie de nils ou de références à des objets qui n'existent plus. Cela est supposé arriver dans une nouvelle version, mais jusque-là, j'ai écrit une API de suppression en cascade pour Realm que je publierai ultérieurement.

En conclusion, après avoir suffisamment appris sur CoreData pour l'utiliser, j'ai hésité à passer à autre chose que la simplicité relative de Realm et le fait qu'il soit un peu plus convivial lorsque vous lancez et quittez le simulateur à plusieurs reprises. signifie que je recommanderais d'utiliser Realm sur CoreData.