【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

本文主要是介绍【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Himi  原创, 欢迎转载,转载请在明显处注明! 谢谢。

           原文地址:http://blog.csdn.net/xiaominghimi/article/details/6948046


          首先向大家说句抱歉,可能一些童鞋看到我的微薄了,我说突然不想写博客了。。。是Himi的错,我不该发微薄让大家担心的;Himi也是因为受到其他的因素影响所以就想这样发泄一下,但是大家放心!写博客是我的兴趣也是我一直的坚持;不再理会其他了,我会继续坚持着自己的路~坚持坚持~


         OK,今天Himi介绍游戏存储这一块,在Android游戏开发中Himi介绍了好几种保存的方式和形式,那么在iOS中也有几种方式,一般常用的有以下四种形式:

       1.  NSKeyedArchiver

       2.  NSUserDefaults

       3.  Write写入方式

       4.  SQLite3

     这里Himi就不再介绍SQlite数据库了,Android游戏存储中我也介绍过SQLite如何保存数据,但是由于这一块很多童鞋没有接触过数据库相关知识,所以即使讲了也没作用,那么对于数据数据库的童鞋们可以参考其他博文或书籍进行学习;

      首先介绍第一种保存方式:NSKeyedArchiver

       代码很简单就不多解释了直接上代码: 

view plain
  1. //=================NSKeyedArchiver========================   
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];   
  5. //----Save  
  6. //这一句是将路径和文件名合成文件完整路径  
  7. NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];   
  8. NSString *filename = [Path stringByAppendingPathComponent:@"saveDatatest"];  
  9. [NSKeyedArchiver archiveRootObject:array toFile:filename];  
  10. //用于测试是否已经保存了数据  
  11. saveStr1 = @"hhhhhhiiii";  
  12. saveStr2 =@"mmmmmmiiii";   
  13. //----Load  
  14. array = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];  
  15. saveStr1 = [array objectAtIndex:0];  
  16. saveStr2 = [array objectAtIndex:1];   
  17. CCLOG(@"str:%@",saveStr1);  
  18. CCLOG(@"astr:%@",saveStr2);  

     首先介绍第二种保存方式:NSUserDefaults

代码很简单就不多解释了直接上代码:

view plain
  1. //=================NSUserDefaults========================  
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];           
  5. //Save  
  6. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];  
  7. [saveDefaults setObject:array forKey:@"SaveKey"];  
  8. //用于测试是否已经保存了数据  
  9. saveStr1 = @"hhhhhhiiii";  
  10. saveStr2 =@"mmmmmmiiii";    
  11. //---Load  
  12. array = [saveDefaults objectForKey:@"SaveKey"];  
  13. saveStr1 = [array objectAtIndex:0];  
  14. saveStr2 = [array objectAtIndex:1];  
  15. CCLOG(@"str:%@",saveStr1);  
  16. CCLOG(@"astr:%@",saveStr2);  

     首先介绍第三种保存方式:Write写入方式

代码很简单就不多解释了直接上代码:

view plain
  1. //=================Write写入方式========================  
  2. NSString *saveStr1 = @"我是";  
  3. NSString *saveStr2 = @"数据";  
  4. NSArray *array = [NSArray arrayWithObjects:saveStr1, saveStr2, nil];   
  5. //----Save  
  6. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  7. NSString *documentsDirectory = [paths objectAtIndex:0];  
  8. if (!documentsDirectory) {  
  9.     NSLog(@"没找到");  
  10. }  
  11. NSMutableArray *saveDataArray=nil;  
  12. NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"Savedatas.plist"];  
  13. [[NSArray arrayWithObjects:array,nil] writeToFile:appFile atomically:NO];  
  14. //用于测试是否已经保存了数据  
  15. saveStr1 = @"hhhhhhiiii";  
  16. saveStr2 =@"mmmmmmiiii";    
  17. //----Load  
  18. if([[NSFileManager defaultManager] fileExistsAtPath:appFile]){  
  19.     saveDataArray = [NSMutableArray arrayWithContentsOfFile:appFile];      
  20. else{  
  21.     saveDataArray = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Savedatas" ofType:@"plist"]];  
  22. }  
  23. NSArray *strArray = [saveDataArray objectAtIndex:0];   
  24. saveStr1 = [strArray objectAtIndex:0];  
  25. saveStr2 = [strArray objectAtIndex:1];  
  26. CCLOG(@"str:%@",saveStr1);  
  27. CCLOG(@"astr:%@",saveStr2);   

不论哪种形式代码都很容易理解,那么以上三种保存方式代码中都带有如下两行代码;

view plain
  1. saveStr1 = @"hhhhhhiiii";  
  2. saveStr2 =@"mmmmmmiiii";   

我已经注释上了,为了验证是否保存数据成功,如果没有保存成功,最后打印的肯定就是hhhhhhiiiiiiiii,mmmmiiiii啦~正常保存的话如下图控制台信息:



      由于本章介绍过于简单,那么下面Himi对Write写入方式保存数据和读取数据封装了两个方法这里放出,给童鞋们行个方便:(其他两种大家封装起来风容易了,这里就不写了);

      封装的函数如下:

view plain
  1. //保存游戏数据  
  2. //参数介绍:  
  3. //   (NSMutableArray *)data :保存的数据  
  4. //   (NSString *)fileName :存储的文件名  
  5. -(BOOL) saveGameData:(NSMutableArray *)data  saveFileName:(NSString *)fileName  
  6. {  
  7.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  8.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  9.     if (!documentsDirectory) {  
  10.         NSLog(@"Documents directory not found!");  
  11.         return NO;  
  12.     }  
  13.     NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
  14.     return ([data writeToFile:appFile atomically:YES]);  
  15. }  
  16. //读取游戏数据  
  17. //参数介绍:  
  18. //   (NSString *)fileName :需要读取数据的文件名  
  19. -(id) loadGameData:(NSString *)fileName  
  20. {  
  21.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  22.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  23.     NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];  
  24.     NSMutableArray *myData = [[[NSMutableArray alloc] initWithContentsOfFile:appFile] autorelease];  
  25.     return myData;  
  26. }  

   使用代码如下:

view plain
  1. NSString *saveStr1 = @"测试保存读取";  
  2. NSString *saveStr2 = @"两个函数";  
  3. NSMutableArray *array = [NSMutableArray arrayWithObjects:saveStr1, saveStr2, nil];   
  4. [self saveGameData:array saveFileName:@"Himi"];  
  5. NSMutableArray*temp =(NSMutableArray*)[self loadGameData:@"Himi"];  
  6. CCLOG(@"%@--%@",[temp objectAtIndex:0],[temp objectAtIndex:1]);  

运行效果截图如下:

          


    这里Himi要提醒大家两点细节也是需要注意的地方:

   1.对于取出数据的时候需要注意,例如如下代码:

view plain
  1. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];   
  2. NSMutableArray *arraySaveData =[saveDefaults objectForKey:@"OhSaveData"];  
  3. //NSMutableArray *arraySaveData=[NSMutableArray arrayWithArray:[saveDefaults objectForKey:@"OhSaveData"]];  

   第二句代码是通过一个文件名获取你存储的数据,返回数据数组,但是!一定要注意这里返回的数据数组是不可修改的!及时你将读取的数据赋给一个可修改的数组中也一样无法修改其中的数据,所以如果你想将取出的数据进行修改那么这里需要要使用第三行代码来获取,这里Himi将获取出的数据数组首先copy给了可修改数组中,那么此时你的可修改数组就可以正常修改了!

   2.修改已经的存储文件;代码如下:

view plain
  1. NSUserDefaults *saveDefaults = [NSUserDefaults standardUserDefaults];   
  2. [saveDefaults setObject:arraySaveData forKey:@"已经存在的文件名"];  

arraySaveData:表示新的数据数组


         OK,本篇就介绍这里吧~继续忙了~

这篇关于【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917951

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式