2013-10-05 19 views
20

Sto facendo un gioco e quando chiudo l'app (chiudi al multitask manager), tutti i miei dati sono andati! Quindi, la mia domanda è molto semplice: Come posso salvare i dati?Come salvare i dati in iOS

+8

Che tipo di dati sta cercando di salvare e quanto? –

risposta

25

Diciamo che si desidera salvare punteggio e livello, che sono entrambe le proprietà di un oggetto chiamato dataHolder.

DataHolder può essere creato come un Singleton, in modo da non dover preoccuparsi troppo da dove si accede (il suo sharedInstance in realtà):

E 'codice sarà un po' come questo:

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 

Non dimenticare di #importare "DataHolder.h" dove è necessario, o semplicemente inserirlo in ...-Prefix.pch.

Si potrebbe effettuare il caricamento effettivo e il salvataggio in appDelegate metodi:

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

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

Puoi accedere al tuo punteggio e livello di dati da qualsiasi luogo con [DataHolder sharedInstance].score e [DataHolder sharedInstance].level.

Questo potrebbe sembrare un eccessivo per un compito semplice ma aiuta sicuri di tenere le cose in ordine e può aiutare a evitare di mantenere tutti i dati in appDelegate (che di solito è il rapido & sporco percorso per la soluzione).

9

È possibile salvare i dati in CoreData, SqlLite o NSUserDefaults Aggiornamento Realm è anche un'opzione e molto facile da implementare.

+9

O un semplice file flat, contenente forse i dati in una rappresentazione JSON o in formato CSV. –

+0

quale è sicuro? –

+1

Se si ha qualcosa di sensibile, non memorizzarlo in NSUserDefaults. Prova a salvare in altri, come Realm sql o dati di base e usa la crittografia. se hai poche cose come il nome utente e la password del token, usa il portachiavi –

10

[NSUserDefaults standardUserDefaults] è utile per piccole quantità di dati come le impostazioni utente e le preferenze. Normalmente lo si utilizza per consentire agli utenti di salvare vari bit di dati che definiscono valori globali come preferenze di caratteri, preferenze di armamenti, qualsiasi cosa, ecc.

Per quantità maggiori di dati come dettagli di livello di gioco o risultati o inventario di armi, ecc. Vorresti usare qualcosa come Core Data. Questo è un database più formale che può essere facilmente migrato man mano che lo schema dei dati cambia. Vedere i documenti qui: Core Data e Core Data Programming Guide

0

Si consiglia di utilizzare Realm per soluzioni più generalizzate.

0

Swift 3

Usa UserDefaults

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

Si può anche persistere array usando questo

1

Ci sono pochi modi per salvare i dati in ios.

  1. UserDefaults - ottimo modo per salvare una piccola quantità di dati.
  2. Portachiavi: posizione sicura per la sicurezza di dati sensibili come i dati di accesso e le password.
  3. database SQLite - Se l'applicazione dispone di una quantità enorme di dati strutturati
  4. CoreData - sulla base di un oggetto grafico che descrive gli oggetti che devono essere salvati
  5. salvataggio dei file
  6. - Naturalmente è anche possibile salvare direttamente tutti i tipi di file nel file system. Tuttavia, è possibile accedere al file system all'interno del contenitore dell'app a causa di motivi di sicurezza.
  7. Utilizzo del database di Realm - migliore alternativa a Core Data e SQLite db
  8. NSKeyedArchiver e NSKeyedUnarchiver - modo migliore per una piccola quantità di oggetti. // penso così

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

Problemi correlati