2013-10-05 46 views
20

我正在做一个游戏,当我关闭应用程序(收于多任务管理器),我所有的数据都消失了!所以,我的问题很简单:如何保存数据?如何将数据保存在iOS版

+8

你到底是什么类型的数据,以节省多少呢? –

回答

25

假设你想保存分数和水平,这是一个名为dataHolder对象的属性。

DataHolder可以被创建为一个单,所以你不必过于担心,从那里你访问它(其sharedInstance实际上):

它的代码看起来有点像这样:

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 

不要忘记#import“DataHolder.h”,你需要它,或者只是把它放在...-Prefix.pch

你可以在appDelegate方法进行实际的加载和保存:

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

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

您可以从任何地方[DataHolder sharedInstance].score[DataHolder sharedInstance].level访问你的分数和级别的数据。

对于一项简单的任务来说,这看起来可能过于矫枉过正,但它确实有助于保持整洁,并且可以帮助您避免将所有数据保留在appDelegate(这通常是解决方案的快捷方式)。

9

可以保存CoreData,SqlLite或NSUserDefaults的数据 更新 境界也是一种选择,很容易实现。

+9

或者一个简单的平面文件,可能包含JSON表示或CSV格式的数据。 –

+0

哪一个是安全的? –

+1

如果你有一些敏感的东西,那么不要将它存储在NSUserDefaults中。尝试保存在其他人,如Realm SQL或核心数据,并使用加密。如果你有像令牌用户名和密码这样的东西,使用钥匙串 –

10

[NSUserDefaults standardUserDefaults]是良好的少量如用户设置和偏好数据。通常,您使用此,使用户能够保存定义全局值,如性格喜好,武器偏好,各种数据的什么,等等

对于较大数额般的游戏级别的细节或成就武器库存等数据你会想要使用像核心数据。这是一个更正式的数据库,可以在数据模式更改时轻松迁移。看到文档在这里: Core DataCore Data Programming Guide

0

我建议使用Realm更多的通用解决方案。

0

斯威夫特3

使用UserDefaults

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

可以使用甚至坚持阵列此

1

有多种方法将数据保存在iOS中。

  1. UserDefaults - 保存少量数据的好方法。
  2. 钥匙串 - 安全的位置,以安全的高敏感数据,如登录数据和密码。
  3. SQLite数据库 - 如果你的应用有一个巨大的结构化数据
  4. CoreData的量 - 基于描述应保存
  5. 保存文件的对象的对象图表 - 当然,你也可以直接保存所有类型的文件到文件系统。但是,由于安全原因,您只能访问应用程序容器内的文件系统。
  6. 使用Realm数据库 - Core Data和SQLite的最佳替代方案db
  7. NSKeyedArchiver和NSKeyedUnarchiver - 对于少量对象更好的方法。 //我是这样认为的

裁判 - http://www.thomashanning.com/data-persistence-ios/