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?
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
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:
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:
J'utilise FMDB pour tous mes projets qui utilisent beaucoup "INSERT
s" 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)
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.
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:
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:
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.