咱們下邊介紹如何經過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
[html] view plaincopysql
int NoteDAO::initDB() 數據庫
{ 微信
auto sharedFileUtils = FileUtils::getInstance(); 函數
string path = dbDirectoryFile(); ① 網站
bool isExist = false; spa
isExist = sharedFileUtils->isFileExist(path); ② .net
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課堂微信公共平臺