1. 程式人生 > >Cocos2d-x資料持久化-修改資料

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函式釋放資源。
這與查詢資料少了提取欄位資料這個步驟,其他步驟是一樣的。下面我們看看程式碼部分。
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選單時候回撥的函式。