[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2d/513.html](http://www.himigame.com/iphone-cocos2d/513.html "【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3")
[](http://blog.csdn.net/xiaominghimi/article/details/6948046)
OK,今天Himi介紹游戲存儲這一塊,在Android游戲開發中Himi介紹了好幾種保存的方式和形式,那么在iOS中也有幾種方式,一般常用的有以下四種形式:
1.NSKeyedArchiver(加密形式)
2.NSUserDefaults
3. ?Write寫入方式
4.SQLite3
這里Himi就不再介紹SQlite數據庫了,Android游戲存儲中我也介紹過SQLite如何保存數據,但是由于這一塊很多童鞋沒有接觸過數據庫相關知識,所以即使講了也沒作用,那么對于數據數據庫的童鞋們可以參考其他博文或書籍進行學習;
首先介紹第一種保存方式:NSKeyedArchiver
代碼很簡單就不多解釋了直接上代碼:?
~~~
//=================NSKeyedArchiver========================???
NSString?*saveStr1?=?@"我是";??
NSString?*saveStr2?=?@"數據";??
NSArray?*array?=?[NSArray?arrayWithObjects:saveStr1,?saveStr2,?nil];???
//----Save??
//這一句是將路徑和文件名合成文件完整路徑??
NSString?*Path?=?[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES)?objectAtIndex:0];???
NSString?*filename?=?[Path?stringByAppendingPathComponent:@"saveDatatest"];??
[NSKeyedArchiver?archiveRootObject:array?toFile:filename];??
//用于測試是否已經保存了數據??
saveStr1?=?@"hhhhhhiiii";??
saveStr2?=@"mmmmmmiiii";???
//----Load??
array?=?[NSKeyedUnarchiver?unarchiveObjectWithFile:?filename];??
saveStr1?=?[array?objectAtIndex:0];??
saveStr2?=?[array?objectAtIndex:1];???
CCLOG(@"str:%@",saveStr1);??
CCLOG(@"astr:%@",saveStr2);??
~~~
首先介紹第二種保存方式:NSUserDefaults
代碼很簡單就不多解釋了直接上代碼:
~~~
//=================NSUserDefaults========================??
NSString?*saveStr1?=?@"我是";??
NSString?*saveStr2?=?@"數據";??
NSArray?*array?=?[NSArray?arrayWithObjects:saveStr1,?saveStr2,?nil];???????????
//Save??
NSUserDefaults?*saveDefaults?=?[NSUserDefaults?standardUserDefaults];??
[saveDefaults?setObject:array?forKey:@"SaveKey"];??
//用于測試是否已經保存了數據??
saveStr1?=?@"hhhhhhiiii";??
saveStr2?=@"mmmmmmiiii";????
//---Load??
array?=?[saveDefaults?objectForKey:@"SaveKey"];??
saveStr1?=?[array?objectAtIndex:0];??
saveStr2?=?[array?objectAtIndex:1];??
CCLOG(@"str:%@",saveStr1);??
CCLOG(@"astr:%@",saveStr2);??
~~~
首先介紹第三種保存方式:Write寫入方式
代碼很簡單就不多解釋了直接上代碼:
~~~
//=================Write寫入方式========================??
NSString?*saveStr1?=?@"我是";??
NSString?*saveStr2?=?@"數據";??
NSArray?*array?=?[NSArray?arrayWithObjects:saveStr1,?saveStr2,?nil];???
//----Save??
NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
NSString?*documentsDirectory?=?[paths?objectAtIndex:0];??
if?(!documentsDirectory)?{??
????NSLog(@"沒找到");??
}??
NSMutableArray?*saveDataArray=nil;??
NSString?*appFile?=?[documentsDirectory?stringByAppendingPathComponent:@"Savedatas.plist"];??
[[NSArray?arrayWithObjects:array,nil]?writeToFile:appFile?atomically:NO];??
//用于測試是否已經保存了數據??
saveStr1?=?@"hhhhhhiiii";??
saveStr2?=@"mmmmmmiiii";????
//----Load??
if([[NSFileManager?defaultManager]?fileExistsAtPath:appFile]){??
????saveDataArray?=?[NSMutableArray?arrayWithContentsOfFile:appFile];??????
}?else{??
????saveDataArray?=?[NSMutableArray?arrayWithContentsOfFile:[[NSBundle?mainBundle]?pathForResource:@"Savedatas"?ofType:@"plist"]];??
}??
NSArray?*strArray?=?[saveDataArray?objectAtIndex:0];???
saveStr1?=?[strArray?objectAtIndex:0];??
saveStr2?=?[strArray?objectAtIndex:1];??
CCLOG(@"str:%@",saveStr1);??
CCLOG(@"astr:%@",saveStr2);???
~~~
不論哪種形式代碼都很容易理解,那么以上三種保存方式代碼中都帶有如下兩行代碼;
~~~
saveStr1?=?@"hhhhhhiiii";??
saveStr2?=@"mmmmmmiiii";???
~~~
我已經注釋上了,為了驗證是否保存數據成功,如果沒有保存成功,最后打印的肯定就是hhhhhhiiiiiiiii,mmmmiiiii啦~正常保存的話如下圖控制臺信息:

由于本章介紹過于簡單,那么下面Himi對Write寫入方式保存數據和讀取數據封裝了兩個方法這里放出,給童鞋們行個方便:(其他兩種大家封裝起來風容易了,這里就不寫了);
封裝的函數如下:
~~~
//保存游戲數據??
//參數介紹:??
//???(NSMutableArray?*)data?:保存的數據??
//???(NSString?*)fileName?:存儲的文件名??
-(BOOL)?saveGameData:(NSMutableArray?*)data??saveFileName:(NSString?*)fileName??
{??
????NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
????NSString?*documentsDirectory?=?[paths?objectAtIndex:0];??
????if?(!documentsDirectory)?{??
????????NSLog(@"Documents?directory?not?found!");??
????????return?NO;??
????}??
????NSString?*appFile?=?[documentsDirectory?stringByAppendingPathComponent:fileName];??
????return?([data?writeToFile:appFile?atomically:YES]);??
}??
//讀取游戲數據??
//參數介紹:??
//???(NSString?*)fileName?:需要讀取數據的文件名??
-(id)?loadGameData:(NSString?*)fileName??
{??
????NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
????NSString?*documentsDirectory?=?[paths?objectAtIndex:0];??
????NSString?*appFile?=?[documentsDirectory?stringByAppendingPathComponent:fileName];??
????NSMutableArray?*myData?=?[[[NSMutableArray?alloc]?initWithContentsOfFile:appFile]?autorelease];??
????return?myData;??
}??
~~~
使用代碼如下:
~~~
NSString?*saveStr1?=?@"測試保存讀取";??
NSString?*saveStr2?=?@"兩個函數";??
NSMutableArray?*array?=?[NSMutableArray?arrayWithObjects:saveStr1,?saveStr2,?nil];???
[self?saveGameData:array?saveFileName:@"Himi"];??
NSMutableArray*temp?=(NSMutableArray*)[self?loadGameData:@"Himi"];??
CCLOG(@"%@--%@",[temp?objectAtIndex:0],[temp?objectAtIndex:1]);
~~~
運行效果截圖如下:

這里Himi要提醒大家兩點細節也是需要注意的地方:
1.對于取出數據的時候需要注意,例如如下代碼:
~~~
NSUserDefaults?*saveDefaults?=?[NSUserDefaults?standardUserDefaults];???
NSMutableArray?*arraySaveData?=[saveDefaults?objectForKey:@"OhSaveData"];??
//NSMutableArray?*arraySaveData=[NSMutableArray?arrayWithArray:[saveDefaults?objectForKey:@"OhSaveData"]];??
~~~
第二句代碼是通過一個文件名獲取你存儲的數據,返回數據數組,但是!一定要注意這里返回的數據數組是不可修改的!及時你將讀取的數據賦給一個可修改的數組中也一樣無法修改其中的數據,所以如果你想將取出的數據進行修改那么這里需要要使用第三行代碼來獲取,這里Himi將獲取出的數據數組首先copy給了可修改數組中,那么此時你的可修改數組就可以正常修改了!
2.修改已經的存儲文件;代碼如下:
~~~
NSUserDefaults?*saveDefaults?=?[NSUserDefaults?standardUserDefaults];???
[saveDefaults?setObject:arraySaveData?forKey:@"已經存在的文件名"];??
~~~
arraySaveData:表示新的數據數組
OK,本篇就介紹這里吧~繼續忙了~
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取"產品付費數量等于0的問題"】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&自定義類細節說明&Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&&Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d­2.0­x­2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)