【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式; 推荐

简介:

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

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

       1.  NSKeyedArchiver

       2.  NSUserDefaults

       3.  Write写入方式

       4.  SQLite3

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

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

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


  
  
  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

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


  
  
  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写入方式

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

 


  
  
  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);    

 

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

 


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

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

 

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

      封装的函数如下:


  
  
  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. }   

 

使用代码如下:


  
  
  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.对于取出数据的时候需要注意,例如如下代码:


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

 

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

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


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

arraySaveData:表示新的数据数组

 

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

 

 

 

 


  
  
  1.  




本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/709144,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
468 4
|
7月前
|
iOS开发 开发者
iOS平台RTMP|RTSP播放器如何实时回调YUV数据
我们在做RTMP、RTSP播放器的时候,有开发者需要自己处理拉取到的YUV数据,做二次分析之用,为此,我们做了以下的设计:InitPlayer之后,再调用SmartPlayerStart()接口之前,设置yuv数据回调即可。
|
10月前
|
Java iOS开发
iOS的数据序列化(又称持久化)的两类使用方式
iOS的数据序列化(又称持久化)的两类使用方式
91 0
|
10月前
|
存储 数据库 对象存储
IOS的四种数据存储方式及优劣
IOS的四种数据存储方式及优劣
287 1
|
10月前
|
Java 开发工具 Android开发
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
本文介绍了使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践。
621 7
SLS:使用 OTel 官方 SDK 采集 Android、iOS Trace 数据实践
|
10月前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
458 1
|
10月前
|
JSON JavaScript 安全
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据
92 1
|
10月前
|
Web App开发 网络安全 Android开发
🚀2023最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包
在移动应用程序的开发中,了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法,可以让我们分析应用程序的网络请求和响应,了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具,可以帮助我们在 Android 和 iOS 平台上进行数据抓包。本篇博客将介绍如何使用克魔助手在 iOS 平台上进行数据抓包。
|
10月前
|
存储 安全 数据安全/隐私保护
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
IOS开发数据存储:解释一下 iOS 中的 Keychain,它的作用是什么?
512 4
|
10月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
163 0

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 7
    iOS各个证书生成细节
  • 8
    uniapp云打包ios应用证书的获取方法,生成指南
  • 9
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 10
    【iOS-cocos2d-X 游戏开发之十】自定义各类模版&触屏事件讲解!
  • 1
    uniapp云打包ios应用证书的获取方法,生成指南
    27
  • 2
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    117
  • 3
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    20
  • 4
    iOS各个证书生成细节
    36
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    161
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    73
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    65
  • 10
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    172