Données de base VS Sqlite ou FMDB …?

Maintenant, cela pourrait ressembler à un fil dupliqué, mais ma question est que j'ai lu beaucoup de questions comme .. Core Data vs SQLite 3 et d'autres, mais ceux-ci sont 2-3 ans. J'ai aussi lu que FMDB a été développé car datatables de base n'étaient pas supscopes sur iOS, donc il ne devrait plus être utilisé. Et d'autre part, j'ai lu que l'on ne devrait pas utiliser datatables de base comme database.

Donc, je suis sérieusement confus, que je devrais utiliser des données de base pour le stockage d'objects ou non . Je veux dire sur quelle base je devrais décider lequel utiliser? Y a-t-il des directives fournies par Apple ou quelqu'un d'autre? Ou est-ce quelque chose qui viendra à moi avec le time.?

Ankit,

Voici le tl; dr skinny: utilisez Core Data.

Voici la forme longue:

Bien que vous puissiez utiliser plusieurs critères pour choisir entre des données de base, un ORM (FMDB) ou des appels sqlite directs, le coût réel de ce choix vient de votre time pour l'utiliser, du support d'Apple et d'autres projets. (RESTKit, qui associe les services REST aux Core Data, est populaire ces jours-ci.)

Par conséquent, un grand pourcentage du time, disons 90 +% (une statistique inventée), la réponse sur iOS sera d'utiliser des données de base. Pourquoi? Une fois que vous avez compris et créé quelques petites methods d'aide, Core Data vous permet de restr dans un monde informatique cohérent: le graphique d'objects Objective-C. Core Data vous apprendra des choses sur la façon d'utiliser un langage dynamic qui aidera tous les autres aspects de votre programmation iOS. Par conséquent, vous êtes plus productif. Ne pas combattre le cadre.

Si vous proposez une database 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 time à écrire une simple application de command line basée sur Mac pour migrer la database vers un DB de database est une tâche finie et simple. Vous êtes presque assuré de devoir réécrire la majeure partie de la logique métier dans Objective-C. (Oui, C ++ et Objective-C ++ sont tous les deux de bonnes technologies: votre logique de database a-t-elle vraiment été réglée pour fonctionner sur un périphérique à memory limitée?) Je ne le pensais pas.

Core Data obtient un coup sur la performance. C'est vraiment très rapide. Vous avez juste à l'utiliser différemment que vous utilisez une database. En particulier, vous allez presque toujours extraire des données du magasin et ensuite les affiner en utilisant des prédicats directement sur les différents sets et arrays. Sur les appareils iOS, où le flash est étonnamment lent, cette stratégie de surenchère est particulièrement efficace. Vous avez réellement beaucoup de RAM sur ces appareils, utilisez-les pour gagner en performance. (Oui, je sais que ceci est une contradiction apparente avec mon raisonnement ci-dessus sur la logique métier portable.) Mais vraiment, le code porté à partir d'un environnement de bureau ou server a tant d'hypothèses implicites sur la vitesse du disque, la quantité de memory et la réalité une VM avec un backing store, ça ne fonctionnera pas bien sur un appareil à batterie avec memory limitée avec un model de memory funky. [Cela ne marchera pas très bien non plus sur les appareils Android.]) Vous allez également dénormaliser vos données pour simplifier l'afficher dans divers widgets iOS et Mac OS X UI. Il y a quelques applications où datatables de base seront plus lentes qu'une database SQLite équivalente. Ceux-ci ont été détaillés ailleurs. La principale affirmation est que les tâches pour lesquelles les identifiants sont définis par les bases de données en amont atteignent les performances de Core Data. Mais il peut être quelque peu atténué par une indexing judicieuse et une search excessive.

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

En d'autres termes, vous avez dû aller «tout compris» pour utiliser Objective-C sur iOS / Mac OS X, vous bénéficierez également d'importants gains de productivité grâce à l'utilisation de Core Data.

Andrew

J'ai récemment entrepris ce voyage moi-même et j'ai fini par essayer les trois. Voici ce que j'ai appris:

  • Sqlite3 brute
    • Bas niveau, access complet à la database. 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 database générée par Apple. Utile pour la synchronisation d'iCloud et la gestion simple de données d'iOS seulement. Difficile et dangereux d'accéder directement à la database, et ne devrait pas être utilisé pour les bases de données multiplateforms. Il faut encore beaucoup de code pour faire des choses simples.
  • FMDB
    • Haut niveau, très abstraction amicale mais pas forcée. Toujours avoir un access complet à la database si vous en avez besoin. Fournit un NSDictionary du résultat avec chaque élément automatiquement catalogué à la variante mutable du type de données approprié (par exemple, les colonnes de text sont renvoyées comme NSMutableSsortingng ). J'ai fini par build une class wrapper très simple pour l'abstraire encore plus, donc j'ai une class auxiliaire avec des fonctions statiques comme selectAllFrom:(NSSsortingng *)table where:(NSDictionary *)conditions , qui returnne un NSArray d'objects NSDictionary . C'est fantastique de pouvoir faire des choses comme NSArray *usersNamedJoe = [DBHelper selectAllFrom:@"user" where:@{@"name": @"Joe"}]; .

Fondamentalement, alors que datatables de base peuvent être utiles pour de simples applications iOS uniquement, toute personne intéressée à utiliser des bases de données multiplateforms devrait restr loin, loin d'elle – Apple n'a aucun intérêt à rendre cela facile, et ça se voit.


TL; DR:

  • N'utilisez pas sqlite3 brut sauf si vous faites quelque chose d'extrêmement sortingvial.
  • Les données de base sont parfaites pour datatables simples sur iOS seulement, si vous êtes à l'aise avec le fait d'y être enfermé.
  • Si vous voulez un contrôle total de la database et que vous ne faites rien de sortingvial, ou si vous construisez votre application pour plusieurs plates-forms, FMDB est définitivement la solution.

J'utilise FMDB pour tous mes projets qui ont une utilisation intensive de " INSERT s" et FMDB n'est pas obsolète. Le dernier commit sur Github était en novembre dernier. Si vous allez avec SQL, je vous recommand d'utiliser FMDB.

Core Data s'adapte à 95% de tous les projets, mais s'il s'agit d'optimization pour fonctionner à un mur. Si vous souhaitez bénéficier des avantages de Core Data (POO, …), utilisez-le. Si vous avez beaucoup d'insert une suppression avec " WHERE " user Sqlite (FMDB)

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

CoreData n'est pas seulement une abstraction d'une database SQL. CoreData est également la gestion de graphe d'object. 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 database. Mais CoreData peut fournir cette performance si vous l'utilisez de la bonne façon. Mais cela prend du time à apprendre. Il y a beaucoup de choses qui sont sortingviales à faire dans CoreData qui seraient très complexes à faire dans FMDB.

En tant que nouveau mec SQL, je vais lancer mon .02:

Dans Core Data, vous disposez d'un peu de code "standard" que vous devez mettre avant de pouvoir réellement utiliser votre database. Votre application a besoin d'au less l'un de ceux-ci: 1) un coordinateur de magasin persistant; 2) un context d'object géré; 3) un object géré. Ceci est corrélé à une entité, qui est corrélée à une table si vous utilisez une database SQLite.

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

D'un autre côté, nous avons SQLite qui, à mon avis, est beaucoup plus facile à comprendre. Pour commencer, vous aurez besoin de: 1) Une database 2) Un tableau ou plus (selon vos données) 3) Connaissance de SQL – un langage flexible avec une syntaxe simplist (les requêtes SELECT font plus que ce que vous pensiez faire 4) Un object par lequel votre application communique avec SQLite.

Core Data est seulement une abstraction d'object de la database SQLite3. Cela signifie que vous aurez des objects persistants faciles à gérer pour les opérations de database standard. Vous pouvez également travailler dans un mode transactionnel et concevoir votre structure de database de base dans XCode en créant des templates.

Si vous ne souhaitez pas créer manuellement votre database SQLite3 ou des methods persistantes, utilisez datatables de base.