web-dev-qa-db-fra.com

Comment sauvegarder des données dans iOS

Je fais un jeu et quand je ferme l'application (fermez le gestionnaire multitâche), toutes mes données sont parties! Donc, ma question est très simple: Comment puis-je sauvegarder les données?

22
CenoX

Supposons que vous souhaitiez enregistrer le score et le niveau, qui sont les deux propriétés d'un objet appelé dataHolder.

DataHolder peut être créé en tant que singleton, vous n'avez donc pas à vous soucier de l'endroit d'où vous y accédez (sa sharedInstance en fait):

Son code ressemblerait un peu à ça:

DataHolder.h

#import <Foundation/Foundation.h>

@interface DataHolder : NSObject 

+ (DataHolder *)sharedInstance;

@property (assign) int level;
@property (assign) int score;

-(void) saveData;
-(void) loadData;

@end

DataHolder.m

NSString * const kLevel = @"kLevel";
NSString * const kScore = @"kScore";

@implementation DataHolder

- (id) init
{
    self = [super init];
    if (self)
    {
        _level = 0;
        _score = 0;
    }
    return self;
}

+ (DataHolder *)sharedInstance
{
    static MDataHolder *_sharedInstance = nil;
    static dispatch_once_t onceSecurePredicate;
    dispatch_once(&onceSecurePredicate,^
                  {
                      _sharedInstance = [[self alloc] init];
                  });

    return _sharedInstance;
}

//in this example you are saving data to NSUserDefault's
//you could save it also to a file or to some more complex
//data structure: depends on what you need, really

-(void)saveData
{
    [[NSUserDefaults standardUserDefaults] 
        setObject:[NSNumber numberWithInt:self.score] forKey:kScore];

    [[NSUserDefaults standardUserDefaults] 
        setObject:[NSNumber numberWithInt:self.level] forKey:kLevel];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)loadData
{
    if ([[NSUserDefaults standardUserDefaults] objectForKey:kScore])
    {
        self.score = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
            objectForKey:kScore] intValue];

        self.level = [(NSNumber *)[[NSUserDefaults standardUserDefaults] 
            objectForKey:kLevel] intValue];
    }
    else
    {
        self.level = 0;
        self.score = 0;
    } 
}

@end

N'oubliez pas de #importer "DataHolder.h" où vous en avez besoin, ou simplement le mettre dans ...-Prefix.pch.

Vous pouvez effectuer le chargement et l’enregistrement dans les méthodes appDelegate:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[DataHolder sharedInstance] saveData];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[DataHolder sharedInstance] loadData];
}

Vous pouvez accéder à vos données de score et de niveau de n’importe où avec [DataHolder sharedInstance].score et [DataHolder sharedInstance].level.

Cela peut sembler excessif pour une tâche simple, mais cela aide certainement à garder les choses en ordre et cela peut vous aider à éviter de garder toutes les données dans appDelegate (qui est généralement le chemin rapide et sale vers la solution).

26
Rok Jarc

[NSUserDefaults standardUserDefaults] convient aux petites quantités de données, telles que les paramètres utilisateur et les préférences. En règle générale, vous utilisez cette option pour permettre aux utilisateurs de sauvegarder diverses informations définissant des valeurs globales telles que les préférences de personnage, les préférences d’arme, etc.

Pour de plus grandes quantités de données telles que les détails de niveau de jeu, les réalisations ou l'inventaire d'armes, etc. Vous voudrez utiliser quelque chose comme des données de base. Il s'agit d'une base de données plus formelle qui peut être facilement migrée à mesure que votre schéma de données change. Voir la documentation ici: Données de base et Guide de programmation de données de base

10
Cliff Ribaudo

Vous pouvez enregistrer des données dans Core Data, Sqlite ou NSUserDefaults Update Realm est également une option très simple à mettre en œuvre.

9
Adnan Aftab

Il existe peu de moyens de sauvegarder des données dans ios.

  1. UserDefaults - Un excellent moyen de sauvegarder une petite quantité de données.
  2. Porte-clés - emplacement sûr pour sauvegarder des données sensibles telles que les données de connexion et les mots de passe.
  3. Sqlite Database - Si votre application contient une grande quantité de données structurées
  4. CoreData - basé sur un graphe d'objets décrivant les objets à sauvegarder
  5. Enregistrement de fichiers - Bien entendu, vous pouvez également enregistrer directement tous les types de fichiers dans le système de fichiers. Cependant, vous pouvez simplement accéder au système de fichiers dans le conteneur d'applications pour des raisons de sécurité. 
  6. Utilisation de la base de données Realm - la meilleure alternative aux bases de données Core Data et SQLite
  7. NSKeyedArchiver et NSKeyedUnarchiver - un meilleur moyen de gérer une petite quantité d'objets. // Je le pense

ref - http://www.thomashanning.com/data-persistence-ios/

1
BatyrCan

Swift 3

Utilisez UserDefaults

UserDefaults.standard.set(„some value”, „key”)
let value = UserDefaults.standard.string(„key”)

Vous pouvez même persister tableau en utilisant cette 

1
Jakub Pomykała

Je recommande d'utiliser Realm pour des solutions plus généralisées.

0
Amr Lotfy