Cocos2d-x中建立SQLite數據庫

咱們下邊介紹如何經過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 plaincopy在CODE上查看代碼片派生到個人代碼片sql

  1. int NoteDAO::initDB()  數據庫

  2. {  微信

  3.     auto sharedFileUtils = FileUtils::getInstance();  函數

  4.   

  5.   

  6.     string path = dbDirectoryFile();                                            ①  網站

  7.   

  8.   

  9.     bool isExist = false;  spa

  10.     isExist = sharedFileUtils->isFileExist(path);                                    ②  .net

  11.     if (!isExist) {  指針

  12.         log("NotesList.sqlite3 doesn't exist.");  日誌

  13.         return -1;  

  14.     }  

  15.   

  16.   

  17.     sqlite3* dbNULL;  

  18.     if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) {                             ③  

  19.         sqlite3_close(db);                                                  ④  

  20.         CCASSERT(false, "DB open failure.");                                    ⑤  

  21.     } else {  

  22.         char *err;  

  23.         string createSQL = "CREATE TABLE IF NOT EXISTS   

  24.                                 Note (cdate TEXT PRIMARY KEY, content TEXT)";               ⑥  

  25.   

  26.   

  27.         if (sqlite3_exec(db,createSQL.c_str(),NULL,NULL,&err) != SQLITE_OK) {           ⑦  

  28.             sqlite3_close(db);                                              ⑧  

  29.             CCASSERT(false, "Create table failure.");                               ⑨  

  30.         }  

  31.         sqlite3_close(db);                                                  ⑩  

  32.     }  

  33.   

  34.   

  35.     return 0;  

  36. }  



上述代碼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在CODE上查看代碼片派生到個人代碼片

  1. void HelloWorld::OnClickMenu1(cocos2d::Ref* pSender)  

  2. {  

  3.     NoteDAO::initDB();  

  4.     NoteDAO::create("2008-08-16 10:01:02", "初始化數據.");  

  5. }  



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課堂微信公共平臺

相關文章
相關標籤/搜索