《Cocos2d學習之路》九、資料儲存的幾種方式和基本使用
阿新 • • 發佈:2019-01-09
年前已經把這部分東西學完了,但是後面出現了一個bug,緊接著公司組織關係變更,搬家到新的地方上班等事情,忙完接著就回家過年了。終於,年後開始上班了,抽出空來把blog寫一下。
cocos2dx中資料儲存的幾種方式
1、userdefault
這個類似於android中的sharedpreference,提供了一些基本對於各種資料型別的set,get方法,首先來看一下官方api的介紹:它的基本方法和android的sharedpreference很相似,不過android的需要在設定完值之後.edit().commit()一下才能真正的儲存資料 簡單用法:<span style="font-size:18px;">UserDefault是個微型資料庫,你可以將基礎資料型別儲存在裡面或從裡面讀取出來. 例如:setBoolForKey("played", true)是將一個bool值儲存進去, 其key是"played",因此你可以通過getBoolForKey("played")從資料庫中讀取該bool值 其支援的基礎資料型別如下: bool, int, float, double, string</span>
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的解析的,當然區別很大。下面放一段例項:具體使用要用到Dictionary類<?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* 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
這一部分的學習就先到這裡了,下一篇準備學習一下網路傳輸的知識