標籤:style blog http color io os ar 使用 for
我們下邊介紹如何通過SQLite3提供的API實現MyNotes資料庫建立。建立資料庫一般需要經過如下三個步驟。
(1) 使用sqlite3_open函數開啟資料庫。
(2) 使用sqlite3_exec函數執行Create Table語句,建立資料庫表。
(3) 使用sqlite3_close函數釋放資源。
在這個過程中,我們使用了三個SQLite3 API函數,它們都是純C語言函數。在Cocos2d-x中通過C++調用C函數當然不是什麼問題,NoteDAO.cpp中的NoteDAO::initDB()函數可以初始化資料庫,它的相關代碼如下:
[html] view plaincopy
int NoteDAO::initDB()
{
auto sharedFileUtils = FileUtils::getInstance();
string path = dbDirectoryFile(); ①
bool isExist = false;
isExist = sharedFileUtils->isFileExist(path); ②
if (!isExist) {
log("NotesList.sqlite3 doesn‘t exist.");
return -1;
}
sqlite3* db= NULL;
if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) { ③
sqlite3_close(db); ④
CCASSERT(false, "DB open failure."); ⑤
} else {
char *err;
string createSQL = "CREATE TABLE IF NOT EXISTS
Note (cdate TEXT PRIMARY KEY, content TEXT)"; ⑥
if (sqlite3_exec(db,createSQL.c_str(),NULL,NULL,&err) != SQLITE_OK) { ⑦
sqlite3_close(db); ⑧
CCASSERT(false, "Create table failure."); ⑨
}
sqlite3_close(db); ⑩
}
return 0;
}
上述代碼initDB()函數是初始化資料庫函數,通過這個函數建立資料庫中的表等對象,每次對資料庫進行CRUD操作時候都會調用它。這個函數中處理流程是先判斷資料庫檔案NotesList.sqlite3是否存在,如果不存在就是初始化,如果已經存在則跳出該函數。其中代碼第①行調用dbDirectoryFile()函數,該函數是我們自己封裝的函數,用來獲得可寫入目錄中資料庫檔案NotesList.sqlite3全路徑。第②行代碼是判斷可寫入目錄中資料庫檔案NotesList.sqlite3是否存在,如果不存在程式跳出該函數。
第③行的代碼是建立資料庫,其中sqlite3_open函數的第一個參數是資料庫檔案的完整路徑,需要注意的是在SQLite3函數中接受的是const char*類型資料,需要將string類型資料使用c_str()函數轉換為const char*類型;第二個參數為sqlite3指標變數db的地址;傳回值是int類型。在SQLite3中,我們定義了很多常量,如果傳回值等於常量SQLITE_OK,則說明建立成功。如果開啟資料庫失敗,我們需要使用第④行代碼sqlite3_close(db)關閉資料庫釋放資源,類似的還有第⑧行和第⑩行代碼。第⑤行代碼使用CCASSERT斷言宏,斷言宏是判斷第一個參數false情況下拋出異常,終止程式運行,並且輸出把第二個參數作為日誌內容輸出。
第⑥行代碼是編寫建表SQL語句,代碼如下:
CREATE TABLE IF NOT EXISTS Note (cdate TEXT PRIMARY KEY, content TEXT)
建表語句CREATE TABLE IF NOT EXISTS可以判斷表是否存在,不存在則建立,存在則不建立。如果使用建表語句CREATE TABLE,在表存在的情況下,這會導致資料拋出異常。類似的還有第⑨行代碼。
第⑦行代碼是執行建表語句,其中語句sqlite3_exec(db,createSQL.c_str(),NULL,NULL,&err)執行第⑥行的建表SQL語句,sqlite3_exec函數的第一個參數是sqlite3指標變數db的地址,第二個參數是要執行的SQL語句,第三個參數是要回調的函數,第四個參數是要回呼函數的參數,第五個參數是執行出錯的錯誤資訊。
為了能夠調用NoteDAO中的初始化資料庫函數initDB(),我們需要在HelloWorldScene情境中調用。HelloWorldScene.cpp主要代碼如下:
[html] view plaincopy
void HelloWorld::OnClickMenu1(cocos2d::Ref* pSender)
{
NoteDAO::initDB();
NoteDAO::create("2008-08-16 10:01:02", "初始化資料.");
}
HelloWorld::OnClickMenu1函數是玩家點擊Init DB菜單時候回調的函數,在該函數中通過NoteDAO::initDB()語句實現資料庫的初始化。NoteDAO中initDB()函數是靜態函數,需要執行個體化NoteDAO就可以直接調用。下面的NoteDAO::create("2008-08-16 10:01:02", "初始化資料.")語句是調用NoteDAO中的create函數在Note表中插入一條資料。
更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》
本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com
歡迎加入Cocos2d-x技術討論群:257760386
歡迎關注智捷iOS課堂公用平台
Cocos2d-x中建立SQLite資料庫