如何在iOS中保存数据

时间:2013-10-05 11:47:29

标签: ios persistence

我正在制作游戏,当我关闭应用程序时(关闭多任务管理器),我的所有数据都消失了!所以,我的问题非常简单:如何保存数据?

6 个答案:

答案 0 :(得分:26)

假设您要保存分数和级别,这两者都是名为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中(这通常是解决问题的快速和肮脏的途径) )。

答案 1 :(得分:10)

[NSUserDefaults standardUserDefaults]适用于少量数据,例如用户设置和偏好设置。通常,您可以使用它来保存用户保存定义全局值的各种数据,例如角色首选项,武器首选项等等。

对于大量数据,如游戏级别详细信息或成就或武器库存等,您将需要使用类似核心数据的内容。这是一个更正式的数据库,可以在数据模式更改时轻松迁移。请参阅此处的文档: Core DataCore Data Programming Guide

答案 2 :(得分:9)

您可以将数据保存在Core Data,Sqlite或NSUserDefaults中 的更新 Realm也是一个选项,非常容易实现。

答案 3 :(得分:1)

Swift 3

使用UserDefaults

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

您甚至可以使用此

来保留数组

答案 4 :(得分:1)

在ios中保存数据的方法很少。

  1. UserDefaults - 保存少量数据的好方法。
  2. 钥匙串 - 安全的高位敏感数据的位置,如登录数据和密码。
  3. Sqlite数据库 - 如果您的应用程序有大量结构化数据
  4. CoreData - 基于描述应保存的对象的对象图
  5. 保存文件 - 当然您也可以直接将所有类型的文件保存到文件系统中。但是,出于安全原因,您只能访问应用程序容器中的文件系统。
  6. 使用Realm数据库 - Core Data和SQLite db的最佳替代方案
  7. NSKeyedArchiver和NSKeyedUnarchiver - 针对少量对象的更好方法。 //我想是的
  8. 参考 - http://www.thomashanning.com/data-persistence-ios/

答案 5 :(得分:0)

我建议使用Realm来获得更通用的解决方案。