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

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


          首先向你们说句抱歉,可能一些童鞋看到个人微薄了,我说忽然不想写博客了。。。是Himi的错,我不应发微薄让你们担忧的;Himi也是由于受到其余的因素影响因此就想这样发泄一下,可是你们放心!写博客是个人兴趣也是我一直的坚持;再也不理会其余了,我会继续坚持着本身的路~坚持坚持~数组


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

       1.  NSKeyedArchiver函数

       2.  NSUserDefaults学习

       3.  Write写入方式测试

       4.  SQLite3atom

     这里Himi就再也不介绍SQlite数据库了,Android游戏存储中我也介绍过SQLite如何保存数据,可是因为这一块不少童鞋没有接触过数据库相关知识,因此即便讲了也没做用,那么对于数据数据库的童鞋们能够参考其余博文或书籍进行学习;spa

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

       代码很简单就很少解释了直接上代码: blog

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

相关文章
相关标签/搜索