Cocos2d-x數據持久化-修改數據

修改數據時,涉及的SQL語句有insert、update和delete語句,這3個SQL語句均可以帶參數。修改數據的具體步驟以下所示。
(1) 使用sqlite3_open函數打開數據庫。
(2) 使用sqlite3_prepare_v2函數預處理SQL語句。
(3) 使用sqlite3_bind_text函數綁定參數。
(4) 使用sqlite3_step函數執行SQL語句。
(5) 使用sqlite3_finalize和sqlite3_close函數釋放資源。
這與查詢數據少了提取字段數據這個步驟,其餘步驟是同樣的。下面咱們看看代碼部分。
一、插入備忘錄
html

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片sql

  1. NoteDAO.cpp中的NoteDAO::create插入備忘錄的代碼以下:  數據庫

  2. int NoteDAO::create(string pDate, string pContent)  微信

  3. {  函數

  4.     //初始化數據庫  測試

  5.     initDB();  網站

  6.   

  7.   

  8.     sqlite3* dbNULL;  spa

  9.   

  10.   

  11.     string path = dbDirectoryFile();  .net

  12.   

  13.   

  14.     if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) {                                   code

  15.         sqlite3_close(db);                                                    

  16.         CCASSERT(false, "DB open failure.");  

  17.     } else {  

  18.         string sqlStr = "INSERT OR REPLACE INTO note (cdate, content) VALUES (?,?)";        ①  

  19.         sqlite3_stmt *statement;  

  20.         //預處理過程  

  21.         if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) {          

  22.             //綁定參數開始  

  23.             sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL);                       ②  

  24.             sqlite3_bind_text(statement, 2, pContent.c_str(), -1, NULL);  

  25.   

  26.   

  27.             //執行插入  

  28.             if (sqlite3_step(statement) != SQLITE_DONE) {                           ③  

  29.                 CCASSERT(false, "Insert Data failure.");  

  30.             }  

  31.         }  

  32.         sqlite3_finalize(statement);                                              

  33.         sqlite3_close(db);                                                

  34.     }  

  35.     return 0;  

  36. }  



上述代碼第①行是插入數據的SQL語句,其中的問號(它是佔位符)就是要綁定的參數。第②行代碼sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL)是綁定第一個參數。
第③行代碼中的sqlite3_step(statement)語句執行插入語句,常量SQLITE_DONE表示執行完成。
爲了可以調用NoteDAO中插入備忘錄函數create,咱們須要在HelloWorldScene場景中調用。HelloWorldScene.cpp主要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

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

  2. {  

  3.     string currentTime = MyUtility::getCurrentTime();  

  4.     log("%s",currentTime.c_str());  

  5.     NoteDAO::create(currentTime, "歡迎使用MyNote.");  

  6. }  



HelloWorld::OnClickMenu2函數是玩家點擊Insert Data菜單時候回調的函數。其中MyUtility::getCurrentTime()語句是得到當前時間。
提示  在Win32平臺,採用Visual Studio 進行編譯運行時候中文會有一些麻煩!咱們須要將源代碼文件另存爲Unicode(UTF-8無簽名)格式,能夠參考4.2.5一節解決方法,有的時候會有以下編譯錯誤:error C2001: 常量中有換行符。咱們須要在中文字符後面添加一些英文字符,或者「啊」等特殊的中文字符。例如:"歡迎使用MyNote。"這個字符串後面是中文句號「。」結尾,編譯的時候就會出現error C2001錯誤,本例中咱們採用英文句號「.」結尾,編譯就不會有錯誤,可是會有警告。這種問題只會出如今Win32平臺,其它平臺沒有問題。爲了省事咱們測試時候能夠不採用中文字符。


二、刪除備忘錄
NoteDAO.cpp中的NoteDAO::remove刪除備忘錄的代碼以下:
i

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. nt NoteDAO::remove(string pDate)  

  2. {  

  3.     //初始化數據庫  

  4.     initDB();  

  5.   

  6.   

  7.     sqlite3* dbNULL;  

  8.   

  9.   

  10.     string path = dbDirectoryFile();  

  11.   

  12.   

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

  14.         sqlite3_close(db);  

  15.         CCASSERT(false, "DB open failure.");  

  16.     } else {  

  17.         string sqlStr = "DELETE  from note where cdate =?";  

  18.         sqlite3_stmt *statement;  

  19.         //預處理過程  

  20.         if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) {  

  21.             //綁定參數開始  

  22.             sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL);  

  23.             //執行刪除  

  24.             if (sqlite3_step(statement) != SQLITE_DONE) {  

  25.                 CCASSERT(false, "Delete Data failure.");  

  26.             }  

  27.         }  

  28.         sqlite3_finalize(statement);  

  29.         sqlite3_close(db);  

  30.     }  

  31.     return 0;  

  32. }  



爲了可以調用NoteDAO中刪除備忘錄函數remove,咱們須要在HelloWorldScene場景中調用。HelloWorldScene.cpp主要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

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

  2. {  

  3.     NoteDAO::remove("2008-08-16 10:01:02");  

  4. }  



HelloWorld::OnClickMenu3函數是玩家點擊Delete Data菜單時候回調的函數。


三、修改備忘錄
NoteDAO.cpp中的NoteDAO::modify修改備忘錄的代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. int NoteDAO::modify(string pDate, string pContent)  

  2. {  

  3.     //初始化數據庫  

  4.     initDB();  

  5.   

  6.   

  7.     sqlite3* dbNULL;  

  8.   

  9.   

  10.     string path = dbDirectoryFile();  

  11.   

  12.   

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

  14.         sqlite3_close(db);  

  15.         CCASSERT(false, "DB open failure.");  

  16.     } else {  

  17.         string sqlStr = "UPDATE note set content=? where cdate =?";  

  18.         sqlite3_stmt *statement;  

  19.         //預處理過程  

  20.         if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) {  

  21.             //綁定參數開始  

  22.             sqlite3_bind_text(statement, 1, pContent.c_str(), -1, NULL);              

  23.             sqlite3_bind_text(statement, 2, pDate.c_str(), -1, NULL);  

  24.   

  25.   

  26.             //執行修改數據  

  27.             if (sqlite3_step(statement) != SQLITE_DONE) {  

  28.                 CCASSERT(false, "Upate Data failure.");  

  29.             }  

  30.         }  

  31.         sqlite3_finalize(statement);  

  32.         sqlite3_close(db);  

  33.     }  

  34.     return 0;  

  35. }  



爲了可以調用NoteDAO中修改備忘錄函數modify,咱們須要在HelloWorldScene場景中調用。HelloWorldScene.cpp主要代碼以下:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

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

  2. {  

  3.     NoteDAO::modify("2008-08-16 10:01:02", "修改數據。");  

  4. }  



HelloWorld::OnClickMenu4函數是玩家點擊Update Data菜單時候回調的函數。



更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》

本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com

歡迎加入Cocos2d-x技術討論羣:257760386

歡迎關注智捷iOS課堂微信公共平臺

相關文章
相關標籤/搜索