Cocos2d-x資料持久化-修改資料
阿新 • • 發佈:2019-02-14
修改資料時,涉及的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函式釋放資源。
這與查詢資料少了提取欄位資料這個步驟,其他步驟是一樣的。下面我們看看程式碼部分。
1、插入備忘錄
上述程式碼第①行是插入資料的SQL語句,其中的問號(它是佔位符)就是要繫結的引數。第②行程式碼sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL)是繫結第一個引數。
第③行程式碼中的sqlite3_step(statement)語句執行插入語句,常量SQLITE_DONE表示執行完成。
為了能夠呼叫NoteDAO中插入備忘錄函式create,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
HelloWorld::OnClickMenu2函式是玩家點選Insert Data選單時候回撥的函式。其中MyUtility::getCurrentTime()語句是獲得當前時間。
提示 在Win32平臺,採用Visual Studio 進行編譯執行時候中文會有一些麻煩!我們需要將原始碼檔案另存為Unicode(UTF-8無簽名)格式,可以參考4.2.5一節解決方法,有的時候會有如下編譯錯誤:error C2001: 常量中有換行符。我們需要在中文字元後面新增一些英文字元,或者“啊”等特殊的中文字元。例如:"歡迎使用MyNote。"這個字串後面是中文句號“。”結尾,編譯的時候就會出現error C2001錯誤,本例中我們採用英文句號“.”結尾,編譯就不會有錯誤,但是會有警告。這種問題只會出現在Win32平臺,其它平臺沒有問題。為了省事我們測試時候可以不採用中文字元。
2、刪除備忘錄
NoteDAO.cpp中的NoteDAO::remove刪除備忘錄的程式碼如下:
i
為了能夠呼叫NoteDAO中刪除備忘錄函式remove,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
HelloWorld::OnClickMenu3函式是玩家點選Delete Data選單時候回撥的函式。
3、修改備忘錄
NoteDAO.cpp中的NoteDAO::modify修改備忘錄的程式碼如下:
為了能夠呼叫NoteDAO中修改備忘錄函式modify,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
(1) 使用sqlite3_open函式開啟資料庫。
(2) 使用sqlite3_prepare_v2函式預處理SQL語句。
(3) 使用sqlite3_bind_text函式繫結引數。
(4) 使用sqlite3_step函式執行SQL語句。
(5) 使用sqlite3_finalize和sqlite3_close函式釋放資源。
這與查詢資料少了提取欄位資料這個步驟,其他步驟是一樣的。下面我們看看程式碼部分。
1、插入備忘錄
NoteDAO.cpp中的NoteDAO::create插入備忘錄的程式碼如下: int NoteDAO::create(string pDate, string pContent) { //初始化資料庫 initDB(); sqlite3* db= NULL; string path = dbDirectoryFile(); if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) { sqlite3_close(db); CCASSERT(false, "DB open failure."); } else { string sqlStr = "INSERT OR REPLACE INTO note (cdate, content) VALUES (?,?)"; ① sqlite3_stmt *statement; //預處理過程 if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) { //繫結引數開始 sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL); ② sqlite3_bind_text(statement, 2, pContent.c_str(), -1, NULL); //執行插入 if (sqlite3_step(statement) != SQLITE_DONE) { ③ CCASSERT(false, "Insert Data failure."); } } sqlite3_finalize(statement); sqlite3_close(db); } return 0; }
上述程式碼第①行是插入資料的SQL語句,其中的問號(它是佔位符)就是要繫結的引數。第②行程式碼sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL)是繫結第一個引數。
第③行程式碼中的sqlite3_step(statement)語句執行插入語句,常量SQLITE_DONE表示執行完成。
為了能夠呼叫NoteDAO中插入備忘錄函式create,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
void HelloWorld::OnClickMenu2(cocos2d::Ref* pSender) { string currentTime = MyUtility::getCurrentTime(); log("%s",currentTime.c_str()); NoteDAO::create(currentTime, "歡迎使用MyNote."); }
HelloWorld::OnClickMenu2函式是玩家點選Insert Data選單時候回撥的函式。其中MyUtility::getCurrentTime()語句是獲得當前時間。
提示 在Win32平臺,採用Visual Studio 進行編譯執行時候中文會有一些麻煩!我們需要將原始碼檔案另存為Unicode(UTF-8無簽名)格式,可以參考4.2.5一節解決方法,有的時候會有如下編譯錯誤:error C2001: 常量中有換行符。我們需要在中文字元後面新增一些英文字元,或者“啊”等特殊的中文字元。例如:"歡迎使用MyNote。"這個字串後面是中文句號“。”結尾,編譯的時候就會出現error C2001錯誤,本例中我們採用英文句號“.”結尾,編譯就不會有錯誤,但是會有警告。這種問題只會出現在Win32平臺,其它平臺沒有問題。為了省事我們測試時候可以不採用中文字元。
2、刪除備忘錄
NoteDAO.cpp中的NoteDAO::remove刪除備忘錄的程式碼如下:
i
nt NoteDAO::remove(string pDate) { //初始化資料庫 initDB(); sqlite3* db= NULL; string path = dbDirectoryFile(); if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) { sqlite3_close(db); CCASSERT(false, "DB open failure."); } else { string sqlStr = "DELETE from note where cdate =?"; sqlite3_stmt *statement; //預處理過程 if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) { //繫結引數開始 sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL); //執行刪除 if (sqlite3_step(statement) != SQLITE_DONE) { CCASSERT(false, "Delete Data failure."); } } sqlite3_finalize(statement); sqlite3_close(db); } return 0; }
為了能夠呼叫NoteDAO中刪除備忘錄函式remove,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
void HelloWorld::OnClickMenu3(cocos2d::Ref* pSender)
{
NoteDAO::remove("2008-08-16 10:01:02");
}
HelloWorld::OnClickMenu3函式是玩家點選Delete Data選單時候回撥的函式。
3、修改備忘錄
NoteDAO.cpp中的NoteDAO::modify修改備忘錄的程式碼如下:
int NoteDAO::modify(string pDate, string pContent)
{
//初始化資料庫
initDB();
sqlite3* db= NULL;
string path = dbDirectoryFile();
if (sqlite3_open(path.c_str(), &db) != SQLITE_OK) {
sqlite3_close(db);
CCASSERT(false, "DB open failure.");
} else {
string sqlStr = "UPDATE note set content=? where cdate =?";
sqlite3_stmt *statement;
//預處理過程
if (sqlite3_prepare_v2(db, sqlStr.c_str(), -1, &statement, NULL) == SQLITE_OK) {
//繫結引數開始
sqlite3_bind_text(statement, 1, pContent.c_str(), -1, NULL);
sqlite3_bind_text(statement, 2, pDate.c_str(), -1, NULL);
//執行修改資料
if (sqlite3_step(statement) != SQLITE_DONE) {
CCASSERT(false, "Upate Data failure.");
}
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
return 0;
}
為了能夠呼叫NoteDAO中修改備忘錄函式modify,我們需要在HelloWorldScene場景中呼叫。HelloWorldScene.cpp主要程式碼如下:
void HelloWorld::OnClickMenu4(cocos2d::Ref* pSender)
{
NoteDAO::modify("2008-08-16 10:01:02", "修改資料。");
}
HelloWorld::OnClickMenu4函式是玩家點選Update Data選單時候回撥的函式。