文档章节

游戏数据存储的四种常用方式

乐逍遥jun
 乐逍遥jun
发布于 2016/02/22 21:39
字数 1255
阅读 43
收藏 0

  原文地址: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:表示新的数据数组

本文转载自:

共有 人打赏支持
乐逍遥jun
粉丝 6
博文 79
码字总数 39510
作品 0
东城
技术主管
私信 提问
ios 数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Writ

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

孙启超
2012/06/13
0
1
【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

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

junwong
2012/03/02
1K
1
Android:SharedPreferences解析和实现记住用户名

SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,它提供了Android平台常规的Long长整形、Int整形、String字符串型的保存。S...

岑浩源
2012/11/28
0
0
【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/327.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童
2012/03/19
0
0
Android数据的四种存储方式之一——总览

Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据...

Airship
2015/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
1
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
4
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部