当前位置: 代码迷 >> SQL >> 游戏数据储存的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3
  详细解决方案

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

热度:365   发布时间:2016-05-05 13:20:41.0
游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

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

  相关解决方案