2013-10-05 15 views
20

Tworzę grę, a kiedy zamykam aplikację (zamykam na menedżerze multitask), wszystkie moje dane zniknęły! Moje pytanie jest bardzo proste: Jak zapisać dane?Jak zapisywać dane w iOS

+8

Jaki typ danych starasz się zaoszczędzić i ile? –

Odpowiedz

25

Załóżmy, że chcesz zapisać wynik i poziom, które są zarówno właściwościami obiektu o nazwie dataHolder.

DataHolder może być utworzony jako pojedyncza, więc nie trzeba się martwić zbytnio skąd ty do niego dostęp (jego sharedInstance faktycznie):

Jest to kod będzie wyglądać trochę tak:

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 

Nie zapomnij o #import "DataHolder.h" tam, gdzie jest to potrzebne, lub po prostu umieść go w ...-Prefix.pch.

Można wykonać rzeczywiste ładowanie i zapisywanie w appDelegate metod:

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

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

można otworzyć swój wynik i poziom danych z dowolnego miejsca [DataHolder sharedInstance].score i [DataHolder sharedInstance].level.

To może wydawać się przesadą dla prostego zadania, ale z pewnością pomaga utrzymać porządek i może pomóc w uniknięciu przechowywania wszystkich danych w appDelegate (co jest zazwyczaj szybką, nieostrą ścieżką do rozwiązania).

9

można zapisać dane w CoreData, SqlLite lub NSUserDefaults Aktualizuj królestwa jest także opcja i bardzo łatwe do wykonania.

+9

Lub prosty plik płaski, być może zawierający dane w reprezentacji JSON lub formacie CSV. –

+0

który z nich jest bezpieczny? –

+1

Jeśli masz jakiś problem, nie przechowuj go w NSUserDefaults. Spróbuj zapisać w innych, takich jak Realm sql lub dane podstawowe i użyj szyfrowania. jeśli masz kilka rzeczy, takich jak nazwa użytkownika tokena i hasło, użyj keychain –

10

[NSUserDefaults standardUserDefaults] jest dobre dla małych ilości danych, takich jak ustawienia i preferencje użytkownika. Zazwyczaj używa się tego, aby umożliwić użytkownikom zapisywanie różnych bitów danych, które definiują wartości globalne, takie jak preferencje dotyczące postaci, preferencje dotyczące broni, cokolwiek itp.

Dla większych ilości danych, takich jak szczegóły poziomu gry, osiągnięcia lub inwentaryzacja broni itp. Będziesz chciał użyć czegoś takiego jak Core Data. Jest to bardziej formalna baza danych, którą można łatwo migrować podczas zmiany schematu danych. Zobacz dokumentację tutaj: Core Data i Core Data Programming Guide

0

Polecam używanie Realm dla bardziej ogólnych rozwiązań.

0

Swift 3

Zastosowanie UserDefaults

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

Można nawet utrzymywać tablicę używając tego

1

Istnieje kilka sposobów, aby zapisać dane w systemie iOS.

  1. UserDefaults - świetny sposób na zapisanie niewielkiej ilości danych.
  2. Keychain - bezpieczna lokalizacja dla bezpieczeństwa ważnych danych, takich jak dane logowania i hasła.
  3. SQLite Database - Jeśli aplikacja posiada ogromną ilość danych strukturyzowanych
  4. CoreData - na podstawie wykresu obiektu, który opisuje obiekty, które powinny być zapisane
  5. Zapisywanie plików - Oczywiście można również bezpośrednio zapisać wszystkie rodzaje pliki do systemu plików. Można jednak uzyskać dostęp do systemu plików w kontenerze aplikacji ze względów bezpieczeństwa.
  6. Korzystanie z bazy danych Realm - najlepsza alternatywa dla danych Core oraz SQLite db
  7. NSKeyedArchiver i NSKeyedUnarchiver - lepszy sposób na niewielką ilością przedmiotów. // tak myślę

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

Powiązane problemy