`
ladymaidu
  • 浏览: 673920 次
文章分类
社区版块
存档分类
最新评论

游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

 
阅读更多

   首先向大家说句抱歉,可能一些童鞋看到我的微薄了,我说突然不想写博客了。。。是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:表示新的数据数组

1
0
分享到:
评论

相关推荐

    iOS四种保存数据的方式

    很不错的 ,iOS四种保存数据的方式,1、NSKeyedArchiver 2、NSUserDefaults 3、Write写入方式 4、SQLite。值得一看

    ios-数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver.zip

    在这篇文章中使用了`archiveRootObject: toFile:、initForWritingWithMutableData:`和`archivedDataWithRootObject:`三种类型归档方法,它们区别如下: 源码地址:github....

    ios-数据的持久化.zip

    使用几个小例子分别实现 归档NSKeyedArchiver、NSUserDefaults、plist文件数据存储,简单直观,代码地址https://github.com/fancyLi/data-store。

    RicdeTmp#TechNote#NSArray、NSDictionary与NSData的相互转换1

    // 方法1:NSKeyedUnarchiver// 方法2:NSJSONSerialization// 方法1:NSKeyedArchiver// 方法2:N

    ios中的四种存储方式demo

    这里面一共写了NSKeyedArchiver,UserDefaults,Write,Sqlit四种方式存储数据的demo。有绝对意义的参考价值。

    XBUserDefaults:利用OC RunTime封装NSUserDefaults

    几乎每个iOS项目中都会使用到NSUserDefaults,作为iOS开发常用的五种数据存储方式之一(NSUserDefaults、plist、NSKeyedArchiver、FMDB、CoreData),NSUserDefaults算是最易用的了。但是项目中用的多了之后key管理...

    iOS应用开发中SQLite的初步配置指南

    提示:上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题。 举例:使用归档 两个问题: (1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性全部读取,这...

    详解iOS的数据存储

    iOS应用数据存储的常用方式  1.XML属性列表(plist)归档.  2.Preference(偏好设置).  3.NSKeyedArchiver归档.  4.SQLite3  5.Core Data 应用沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统...

    AutomaticCoder.zip

    Automatic Coder 可根据 JSON 字符串自动生成对应的 Objective-C 处理代码。 示例代码: ... NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];... ///3

    iOS中的数据库?使用FMDB

    一、回顾 iOS中的数据存储方式  1、XML属性列表(plist)  写入OC的一些基本数据类型,不是所有对象都可以写入  2、Preference(偏好设置)  本质还是通过“plist”来存储数据,但是使用简单(无需关注文件...

    IOS 数据存储详解及实例代码

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XML属性列表(plist)归档 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件...

    iOS数据持久化之属性列表和归档

    iOS数据持久化之属性列表和归档,NSUserDefaults,Plist,NSKeyedArchiver

    ios-FMDB存储数组或者模型.zip

    1.数组存储到数据库的思路:存储前,数组归档(NSKeyedArchiver)为二进制数据,再存入数据库;从数据库取出时肯定也是取出的二进制数据,这时要将二进制数据解档(NSKeyedUnArchiver)为数组; 2.自定义模型存储到...

    FastCoding:NSCoding,属性列表和JSON的更快,更灵活的二进制文件格式替换

    FastCoder的读取速度(平均)已经比Cocoa中的任何内置序列化机制更快,并且写入速度比JSON(不支持任意对象类型)以外的任何机制都更快。 文件大小小于NSKeyedArchiver,并且与其他方法相当。 FastCoder支持比JSON...

    IOS NSKeyedArchiver

    代码展示了使用归档的方法对数据完成持久化,包括对单个,多个,自定义对象进行归档

    使用偏好设置、属性列表、归档解档保存数据、恢复数据

    ### 使用偏好设置、属性列表、归档解档保存数据、恢复数据这个demo通过以下四种方式保存、恢复数据:- NSUserDefaults (偏好设置)- property list 即Plist (属性列表)- NSKeyedArchiver NSKeyedUnarchiver(归档...

    bpylist:解析并生成二进制文件和NSKeyedArchiver档案

    bpylist 和NSKeyedArchiver格式的实现 用法 二元列表 生成bplist很容易,并且类似于Python标准库中的... bpylist支持读取和写入与NSKeyedArchiver兼容的档案。 该API与二进制plist API相似。 取消归档对象 fro

    ios-轻量级对象字典转换库.zip

    四、自动归档解档,所以定义的数据类型直接NSKeyedArchiver保存即可~ 五、一键打印,无论多复杂的数据类型,无论多复杂的组合,只要一句NSLog(@"%@", myObj)帮你无忧debug~ 使用该库,你只需要: 1、.h文件: ...

    NSSerialisationTests:NSJSONSerialization,NSPropertyListSerialization,NSArchiver,NSKeyedArchiver的速度测试

    测试NSJSONSerialization,NSPropertyListSerialization,NSArchiver,NSKeyedArchiver 测试各种本地对象序列化API的应用 样本模型对象: { UUID = "90B471CC-C740-4C1E-A421-EA996E34B505"; point = "{...

Global site tag (gtag.js) - Google Analytics