1. 程式人生 > >《Cocos2d學習之路》九、資料儲存的幾種方式和基本使用

《Cocos2d學習之路》九、資料儲存的幾種方式和基本使用

年前已經把這部分東西學完了,但是後面出現了一個bug,緊接著公司組織關係變更,搬家到新的地方上班等事情,忙完接著就回家過年了。終於,年後開始上班了,抽出空來把blog寫一下。

cocos2dx中資料儲存的幾種方式

1、userdefault

這個類似於android中的sharedpreference,提供了一些基本對於各種資料型別的set,get方法,首先來看一下官方api的介紹:
<span style="font-size:18px;">UserDefault是個微型資料庫,你可以將基礎資料型別儲存在裡面或從裡面讀取出來.
例如:setBoolForKey("played", true)是將一個bool值儲存進去, 其key是"played",因此你可以通過getBoolForKey("played")從資料庫中讀取該bool值
其支援的基礎資料型別如下: bool, int, float, double, string</span>
它的基本方法和android的sharedpreference很相似,不過android的需要在設定完值之後.edit().commit()一下才能真正的儲存資料 簡單用法:
UserDefault::getInstance()->setIntegerForKey("key", 122);
int intkey = UserDefault::getInstance()->getIntegerForKey("key");

log("UserDefault intkey: %d", intkey);

cocos2dx的場景切換不像android的activity跳轉可以通過intent傳遞引數過去,那可以利用這個輕量級的資料儲存來實現引數傳遞

2、plist檔案

plist其實就是xml檔案,主要還是用於獲取資料;雖然是xml,但是cocos2dx封裝過之後使用起來挺像json的解析的,當然區別很大。下面放一段例項:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> 
  <dict> 
    <key>name</key>  
    <string>lumeng</string>  
    <key>age</key>  
    <integer>36</integer>  
    <key>family</key>  
    <dict> 
      <key>son</key>  
      <dict> 
        <key>name</key>  
        <string>xxx</string>  
        <key>age</key>  
        <integer>6</integer> 
      </dict>  
      <key>daughter</key>  
      <dict> 
        <key>name</key>  
        <string>yyy</string>  
        <key>age</key>  
        <integer>3</integer> 
      </dict> 
    </dict> 
  </dict> 
</plist>
具體使用要用到Dictionary類
	Dictionary* dict = Dictionary::createWithContentsOfFile("res/aaa.plist");//載入plist檔案,轉化為Dictionary物件
	const __String* ss = dict->valueForKey("name");//根據key獲取值
	log("Plist name->%s", ss->getCString());

	Ref* family = dict->objectForKey("family");
	Dictionary* dictfamily = (Dictionary*) family;//根據key獲取的值依然是一個dictionary,還需要繼續解析
	Dictionary* son = (Dictionary*) dictfamily->objectForKey("son");
	const __String* sonname = son->valueForKey("name");
	log("Plist sonname->%s", sonname->getCString());

3、sqlite3

sqlite3相信都不陌生,是一個輕量級的資料庫,在移動平臺上比較流行,在android上的資料庫也是基於sqlite3,那在cocos2dx上用sqlite3要用到sqlite3的庫,用法:

1、sqlite3.c&sqlite3.h&sqlite3ext.h,將這三個檔案放入Classes資料夾中

2、win平臺要在vs中將這三個檔案加入進來

3、加入資料庫處理的code

#include "sqlite3.h"

std::string path;
bool initdb() {
	sqlite3* msqlite = NULL;
	path = FileUtils::getInstance()->fullPathForFilename(DBNAME);
//在android上需要使用FileUtils獲取一個可讀寫的路徑,
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
	path = FileUtils::getInstance()->getWritablePath();
	path += "/";
	path += DBNAME;
	FILE* dbfile = fopen(path.c_str(),"r");
	if (dbfile == nullptr) {
		ssize_t size;
		const char* data = (char*)FileUtils::getInstance()->getFileData(DBNAME, "rb", &size);
		dbfile = fopen(path.c_str(), "wb");
		fwrite(data, size, 1, dbfile);
		CC_SAFE_DELETE_ARRAY(data);
	}
	fclose(dbfile);
#endif

	log("dbpath->%s", path.c_str());

	int open = sqlite3_open(path.c_str(), &msqlite);//開啟資料庫
	if (open != SQLITE_OK) {//判斷是否可以開啟
		const char* errmsg = sqlite3_errmsg(msqlite);
		log("errmsg:%s", errmsg);
		return false;
	}
	int result =
			sqlite3_exec(msqlite,
					"CREATE TABLE peoples (id integer primary key AUTOINCREMENT,name text,pwd text)",
					NULL, NULL, NULL);//執行sql語句
	log("1result:%d", result);
	result = sqlite3_exec(msqlite,
			"insert into peoples values(NULL,'lam','123334')", NULL, NULL,
			NULL);
	result = sqlite3_exec(msqlite,
			"insert into peoples values(NULL,'wj','321')", NULL, NULL, NULL);
	log("2result:%d", result);
	sqlite3_close(msqlite);//關閉資料庫
	return true;
}

int sqlite3result(void* key, int c, char** value, char** cols) {//sqlite的回撥函式,每查詢出一行結果就會回撥一次,c是這一行的列數,key是cols,value是value
	log("c=%d", c);
	for (int i = 0; i < c; i++) {
		log("%s=%s", cols[i], value[i]);
	}
	return 0;
}

void HelloWorld::menuSqlite3Callback(Ref* pSender) {
	sqlite3* msqlite;
	int open = sqlite3_open(path.c_str(), &msqlite);
	int result = sqlite3_exec(msqlite, "SELECT * FROM peoples", sqlite3result,
			NULL, NULL);//執行sql語句,如果需要回調,那就需要傳遞一個回撥函式的名字,比如<span style="font-family: Arial, Helvetica, sans-serif;">sqlite3result</span>
	log("Sqlite3 result:%d", result);
	sqlite3_close(msqlite);
}
列印結果:
c=3
id=1
name=lam
pwd=123334
c=3
id=2
name=wj
pwd=321
Sqlite3 result:0

在android裝置上db檔案儲存路徑,列印的log:

02-11 19:21:28.319: D/cocos2d-x debug info(10954): dbpath->/data/data/com.teffy.readdata/files//mysqlite3.db

學習的時候看到一篇對sqlite3的封裝的文章,看起來不錯:http://blog.csdn.net/ym19860303/article/details/8531998

這一部分的學習就先到這裡了,下一篇準備學習一下網路傳輸的知識