首页 > 数据库 >【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3

时间:2022-11-25 15:38:46浏览次数:70  
标签:saveStr1 saveStr2 游戏 NSKeyedArchiver iOS NSString array NSMutableArray objectAtI

 李华明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. "没找到");
      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. "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啦~正常保存的话如下图控制台信息:

      【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3_数据库相关


            由于本章介绍过于简单,那么下面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. "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]);


        运行效果截图如下:

        【iOS-Cocos2d游戏开发之十九】游戏数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Write写入/SQLite3_测试_02


            这里Himi要提醒大家两点细节也是需要注意的地方:

        1.对于取出数据的时候需要注意,例如如下代码:

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

        这里Himi将获取出的数据数组首先copy给了可修改数组中,那么此时你的可修改数组就可以正常修改了!

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

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


        arraySaveData:表示新的数据数组


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


        标签:saveStr1,saveStr2,游戏,NSKeyedArchiver,iOS,NSString,array,NSMutableArray,objectAtI
        From: https://blog.51cto.com/xiaominghimi/5886779

        相关文章