web-dev-qa-db-fra.com

Données de base VS SQLite ou FMDB ....?

Maintenant, cela peut ressembler à un fil en double, mais ma question est que j'ai lu beaucoup de questions du type .. Core Data vs SQLite 3 et d’autres, mais celles-ci datent de deux à trois ans. J'ai également lu que FMDB avait été développé car les données de base n'étaient pas prises en charge sur iOS, elles ne devraient donc plus être utilisées. Et d’autre part, j’ai lu qu’il ne fallait pas utiliser les données de base comme base de données. 

Je suis donc très confus de savoir si je dois utiliser des données de base pour le stockage d'objets ou non. Je veux dire sur quelle base je devrais décider lequel utiliser? Existe-t-il des directives fournies par Apple ou quelqu'un d'autre .. ou est-ce quelque chose qui me parviendra avec le temps?

36
Ankit Srivastava

Ankit,

Voici le tl; dr skinny: utilisez Core Data.

Voici le long formulaire:

Bien que vous puissiez utiliser de nombreux critères pour choisir entre Core Data, un ORM (FMDB) ou des appels directs au format sqlite, le coût réel de ce choix provient de votre temps d'utilisation, de l'assistance d'Apple et de l'exploitation d'autres projets. (RESTKit, qui mappe les services REST sur des données de base, est populaire ces jours-ci.)

Par conséquent, un pourcentage important du temps, disons 90% et plus (une statistique composée), la réponse sur iOS sera d’utiliser Core Data. Pourquoi? Une fois que vous avez compris et créé quelques méthodes d’aide, Core Data vous permet de rester dans un monde informatique cohérent: le graphe d’objets Objective-C. Core Data vous apprendra comment utiliser un langage dynamique qui aidera tous les autres aspects de votre programmation iOS. Par conséquent, vous êtes plus productif. Ne combattez pas le cadre.

Si vous importez une base de données et un schéma SQLite complexes et volumineux à partir d'une autre application, il peut s'avérer rentable d'utiliser FMDB ou SQLite. Mais j'en doute. Votre temps à écrire une simple application de ligne de commande basée sur Mac pour migrer la base de données vers une base de données Core Data est une tâche simple et finie. Vous êtes presque assuré de devoir réécrire l'essentiel de la logique métier dans Objective-C. (Oui, C++ et Objective-C++ sont de bonnes technologies. Votre logique métier de base de données a-t-elle été réellement adaptée pour fonctionner sur un périphérique à mémoire limitée? Je ne le pensais pas.)

Core Data obtient un rendement imbattable. C'est vraiment assez rapide. Vous devez juste l'utiliser différemment de celui que vous utilisez une base de données. En particulier, vous récupérez presque toujours les données du magasin, puis vous les affinez à l'aide de prédicats directement sur les divers ensembles et tableaux. Sur les appareils iOS, où le flash est étonnamment lent, cette stratégie d’extraction excessive est particulièrement efficace. Vous avez en réalité beaucoup de RAM sur ces périphériques, utilisez-le pour gagner en performance. (Oui, je sais que c’est une contradiction apparente à la logique d’entreprise ci-dessus. Mais, en réalité, le code porté depuis un environnement de bureau ou de serveur comporte de nombreuses hypothèses implicites sur la vitesse du disque, la quantité de mémoire et la réalité de un VM avec un magasin de sauvegarde, il ne fonctionnera tout simplement pas bien sur un périphérique alimenté par une batterie et limité en mémoire avec un modèle de mémoire funky. [Il ne fonctionnera pas très bien non plus sur les appareils Android.]) vos données pour simplifier leur affichage dans divers widgets d'interface utilisateur iOS et Mac OS X. Il existe quelques applications où Core Data sera plus lent qu'une base de données SQLite équivalente. Celles-ci ont été détaillées ailleurs. La principale revendication est que les tâches pour lesquelles les ID sont définis par des bases de données en amont ont des conséquences sur les performances de Core Data. Mais il peut être quelque peu atténué par une indexation judicieuse et une extraction excessive.

La chose à retenir à propos des appareils mobiles est aussi que la taille de la base de données, parce que ce sont des appareils mobiles sur les feuilles d'Internet, est généralement de taille modeste. Par conséquent, la performance est plus facile à atteindre. De nombreuses leçons tirées du monde des serveurs peuvent ne pas s'appliquer à ce monde mobile alimenté par batterie.

En d'autres termes, l'utilisation d'Objective-C sur iOS/Mac OS X nécessite une approche "all-in". Vous bénéficierez également d'avantages importants en termes de productivité grâce à l'utilisation de Core Data.

Andrew

45
adonoho

Récemment, je me suis moi-même engagé dans cette aventure et j'ai fini par essayer les trois. Voici ce que j'ai appris:

  • Raw sqlite3
    • Accès bas niveau et complet à la base de données. Pas d'abstractions. Très verbeux - il faut beaucoup de code pour faire des choses très simples.
  • Données de base
    • De très haut niveau, construit sur des abstractions, DOIT utiliser la base de données générée par Apple. Utile pour la synchronisation iCloud et la gestion de données simple uniquement sur iOS. Difficile et dangereux d’accéder directement à la base de données et ne doit pas être utilisé pour des bases de données multiplates-formes. Il faut encore pas mal de code pour faire des choses simples.
  • FMDB
    • De haut niveau, très convivial, mais pas forcé. Toujours avoir un accès complet à la base de données si vous en avez besoin. Fournit une NSDictionary du résultat avec chaque élément transtypé automatiquement dans la variante modifiable du type de données approprié (par exemple, les colonnes de texte sont retournées sous la forme NSMutableString). J'ai fini par construire une classe wrapper très simple autour d'elle pour l'abréger encore plus. J'ai donc une classe helper avec des fonctions statiques comme selectAllFrom:(NSString *)table where:(NSDictionary *)conditions, qui retourne une NSArray de NSDictionary objets. C'est fantastique de pouvoir faire des choses comme NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}];.

Fondamentalement, si Core Data peut être utile pour de simples applications exclusivement iOS, toute personne souhaitant utiliser des bases de données multiplates-formes devrait rester très loin de là. Apple n'a aucun intérêt à simplifier cela, et cela se voit.


TL; DR:

  • N'utilisez pas de sqlite3 brut sauf si vous faites quelque chose d'extrêmement trivial.
  • Les données de base conviennent parfaitement aux données simples uniquement sur iOS, si vous êtes à l'aise avec le verrouillage.
  • Si vous souhaitez avoir un contrôle total sur la base de données et que vous ne faites pas quelque chose de trivial, ou si vous construisez votre application pour plusieurs plates-formes, FMDB est définitivement la voie à suivre.
38
alexwebb2

J'utilise FMDB pour tous mes projets qui utilisent beaucoup "INSERTs" et FMDB n'est pas obsolète. Le dernier engagement sur Github a eu lieu en novembre dernier. Si vous utilisez SQL, je vous recommande d'utiliser FMDB.

Les données de base s’adaptent à 95% de tous les projets, mais s’il s’agit d’optimisation, dirigez-vous vers un mur. Si vous souhaitez bénéficier des avantages des données de base (OOP, ...), utilisez-les. Si vous avez beaucoup d'insérer une suppression avec "WHERE" utilisateur SQLite (FMDB)

Ce POST explique le site off et top pour Core Date vs. Sqlite (FMDB)

8
CarlJ

CoreData est pas simplement une abstraction d'une base de données SQL. CoreData gère également les graphes d'objets. CoreData peut faire des choses que FMDB ne peut tout simplement pas faire.

Comme toujours: cela dépend vraiment de votre cas d'utilisation. Mais dans 99% des cas, CoreData est le bon choix.

Si les performances sont critiques, vous devez toujours comprendre le fonctionnement d'une base de données. Mais CoreData peut offrir cette performance si vous l'utilisez correctement. Mais cela prend du temps à apprendre. Il y a beaucoup de choses triviales à faire dans CoreData qui seraient très complexes à réaliser dans FMDB.

6
Daniel Eggert

En tant que nouveau responsable SQL, je vais ajouter deux points:

Dans Core Data, vous avez un peu de code "passe-partout" que vous devez insérer avant de pouvoir utiliser votre base de données. Votre application a besoin d'au moins l'un de ces éléments:

  1. Un coordinateur de magasin persistant
  2. Un contexte d'objet géré
  3. Un objet géré. Cela correspond à une entité, qui correspond à une table si vous utilisez une base de données SQLite.

Pour tirer pleinement parti du cadre, vous devez comprendre le rôle que ces objets jouent dans la gestion de vos données.

D'autre part, nous avons SQLite, qui - à mon avis - est beaucoup plus facile à comprendre. Pour commencer, vous aurez besoin de:

  1. Une base de données
  2. Une table ou plus (selon vos données)
  3. Connaissance de SQL - un langage flexible avec une syntaxe simpliste (les requêtes SELECT font plus que ce que vous pensiez à l'origine)
  4. Un objet à travers lequel votre application communique avec SQLite. 
2
moonman239

Les données de base sont uniquement une synthèse d'objet de la base de données SQLite3. Cela signifie que vous aurez des objets persistants faciles à gérer pour les opérations de base de données standard. Vous pouvez également travailler en mode transactionnel et concevoir votre structure de base de données dans XCode en créant des modèles.

Si vous ne souhaitez pas créer manuellement votre base de données SQLite3 ou des méthodes persistantes, utilisez Core Data.

0
Stefan Ticu