46 votes

Quelles sont les limitations de NSUserDefaults?

Stocker des données de façon permanente dans un iPhone est fait généralement à l'aide de Données de Base ou de sqlite3. La plupart des gens préfèrent utilisateur NSUserDefaults comme un espace de stockage pour les préférences de l'application, plutôt que de l'utiliser comme une base de données normale (comme sqlite).

J'ai trouvé que la grande quantité de données peuvent être stockées dans NSUserDefaults, il est extrêmement facile à utiliser et il est rapide. Alors pourquoi ne pas utiliser cela comme un stockage permanent? Quelles sont les limites de NSUserDefaults comme une base de données?

Mise à jour:
J'ai souvent utiliser de trois façons différentes d'enregistrer mes données sur le disque.

  • Base de données
  • La sérialisation des objets pour les plists
  • NSUserDefaults

Je n'utilise pas FMDB (sqlite ou directement) plus. Quels sont les principaux avantages et inconvénients de chaque approche?

Certains avantages de NSUserDefaults que j'ai trouver:

  • De tri, de regroupement, etc. peut facilement être fait en utilisant NSPredicate.
  • NSUserDefaults est thread-safe.
  • Il faut une ligne de récupérer et de sauvegarder les données de NSUserDefaults.

16voto

ViTo Brothers Points 4706

Sqlite3 est plus utile pour le maintien de grande base de données et à l'accès aux éléments de base de données. Vous pouvez trier les éléments de la base de données sqlite3, vous pouvez effectuer une recherche très rapide pour l'article dans Sqlite3 dtabase. Base de données Sqlite3 a de nombreux privilèges NSUserDefaults n'ont pas !


NSUserDefaults vs sqlite3

NSUserDefaults est pour les préférences de l'utilisateur, généralement à la base des objets comme NSString ou NSNumber. Sqlite, la sérialisation d'une collection d'objets dans une liste de propriétés, ou les Données de Base sont toutes les options valides pour le stockage des données utilisateur telles que les objets de modèle que vous avez créé.

Vous n'allez pas voir une différence de vitesse, mais il est toujours préférable de choisir le bon mécanisme pour ce que vous faites. Si c'est juste préférences puis utiliser NSUserDefaults, sinon j'aurais sérialiser vos objets à un plist. Si vous êtes nouveau à l'Cacao je voudrais éviter de Base de Données et même sqlite au premier abord, pour vous donner une chance d'apprendre les bases en premier.


NSuserDefault ou Sqlite

Lorsque vous souhaitez stocker grande quantité de données avec une certaine relation, aller pour sqlite si vous souhaitez stocker moins de valeur pour aller NSUserDefault.Sqlite occupe de la mémoire afin de l'utiliser seulement vous avez vraiment besoin d'enregistrer des données complexes.


À l'aide de NSUserDefaults pour enregistrer beaucoup de jeu de données

Généralement NSUserDefaults est utilisé pour enregistrer les paramètres de jeu. Pour sauvegarder les données de jeu, il est généralement préférable d'utiliser SQLite ou vous pouvez créer un NSDictionary des objets et de les enregistrer sur le disque, voici quelques post qui pourront vous aider:

  1. http://www.cocos2d-iphone.org/forum/topic/9308
  2. http://www.cocos2d-iphone.org/forum/topic/9210

9voto

lorean Points 1622

NSUserDefaults offre un trivial courbe d'apprentissage et thread-safe mise en œuvre.

Sinon, j'ai trouvé la Base de Données de qualité supérieure dans tous les sens. Notamment en ce qui concerne la configuration des valeurs par défaut et de migration de routines.

Edit: Comme il s'avère, NSUserDefaults de threads "solidité" semble venir de l'exécution des opérations sur le fil. Cela a causé de graves cadre-les sauter dans une de mes applications; j'ai fini par arracher NSUserDefaults et en le remplaçant par un "thread-safe" NSMutableDictionary qui est sérialisée dans un fichier.

4voto

cem Points 2301

Pour un projet sur lequel je travaille actuellement, je dois mettre en place une grande base de données (environ 400 000 enregistrements). Si vous utilisez NSUserDefaults, vous devez ajouter les enregistrements, ce qui peut prendre quelques minutes (en fonction du périphérique et de la manière dont vous importez vos données). Si vous utilisez CoreData, vous pouvez simplement copier une base de données prédéfinie dans le répertoire de documents de votre application et l'utiliser immédiatement.

C'est pourquoi je m'appuie sur CoreData.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X