1. 程式人生 > >wxWidgets教程(17)——wxSqlite3用法

wxWidgets教程(17)——wxSqlite3用法

一、編譯安裝

vs2015下已編譯好的靜態庫(下載地址

原始碼下載地址:(下載地址

二、最基本的使用示例

	wxSQLite3Database db;
	db.Open(wxT("data.db"));
	if (db.IsOpen()) {
		// 刪除資料庫
		wxString sqlDrop = wxT(R"""(
			DROP TABLE IF EXISTS user
			)""");
		db.ExecuteUpdate(sqlDrop);
		// 建立資料庫
		wxString sqlCreate = wxT(R"""(
			CREATE TABLE IF NOT EXISTS user(
			id INTEGER PRIMARY KEY AUTOINCREMENT,
			username VARCHAR(255) NOT NULL,
			age INTEGER NOT NULL,
			address VARCHAR(50))
			)""");
		db.ExecuteUpdate(sqlCreate);
		// 建立索引
		wxString sqlCreateUnique = wxT(R"""(
			CREATE UNIQUE INDEX username_unique ON user (username)
			)""");
		db.ExecuteUpdate(sqlCreateUnique);
		// 插入資料
		wxString sqlInsert = wxT(R"""(
			INSERT INTO user VALUES (null,"yan.wang",30,"Pudong");
			INSERT INTO user VALUES (null,"kan.wang",20,"Lujiazui");
			)""");
		db.ExecuteUpdate(sqlInsert);
		// 查詢資料
		wxString sqlQuery = wxT(R"""(
			SELECT * FROM user
			)""");
		auto res = db.ExecuteQuery(sqlQuery);
		while (res.NextRow())
		{
			wxLogDebug(wxT("姓名:%s 年齡:%d 地址:%s"),\
				res.GetString(wxT("username")), \
				res.GetInt(wxT("age")), \
				res.GetString(wxT("address")));
		}
		// 修改id為2的年齡為29歲
		auto stm = db.PrepareStatement(wxT("UPDATE user SET age = 29 WHERE id = ?"));
		stm.Bind(1, 2);
		stm.ExecuteUpdate();
		// 再次查詢
		stm = db.PrepareStatement(wxT("SELECT * FROM user WHERE id = ?"));
		stm.Bind(1, 2);
		res = stm.ExecuteQuery();
		while (res.NextRow())
		{
			wxLogDebug(wxT("姓名:%s 年齡:%d 地址:%s"), \
				res.GetString(wxT("username")), \
				res.GetInt(wxT("age")), \
				res.GetString(wxT("address")));
		}

		db.Close();
	}

三、關於資料庫加密

可以在第一次開啟資料庫檔案的時候,指定字串祕鑰或二進位制祕鑰,當其他人開啟的時候,就會報錯:file is not a database

程式碼如下:

	try
	{
		wxSQLite3Database db;
		db.Open(wxT("data.db"), wxT("key_str"));
		if (db.IsOpen()) {
			wxString sqlCreate = wxT(R"""(
				CREATE TABLE IF NOT EXISTS user(
				id INTEGER PRIMARY KEY AUTOINCREMENT,
				username VARCHAR(255) NOT NULL,
				age INTEGER NOT NULL,
				address VARCHAR(50))
			)""");
			db.ExecuteUpdate(sqlCreate);
			db.Close();
		}
	}
	catch (const wxSQLite3Exception& e)
	{
		wxLogDebug(e.GetMessage());
	}

你也可以開啟資料以後,重置這個祕鑰,程式碼如下:
	try
	{
		wxSQLite3Database db; 
		db.Open(wxT("data.db"), wxT("key_str"));
		if (db.IsOpen()) {
			db.ReKey(wxT("other_key"));
			db.Close();
		}
	}
	catch (const wxSQLite3Exception& e)
	{
		wxLogDebug(e.GetMessage());
	}

如果擔心上面的字串祕鑰不夠安全,可以使用二進位制祕鑰,程式碼如下:
	try
	{
		wxSQLite3Database db; 
		db.Open(wxT("data.db"), wxT("other_key"));
		if (db.IsOpen()) {
			// 生成二進位制祕鑰
			wxChar ch[] = wxT("helloworld");
			wxMemoryBuffer buffer;
			buffer.AppendData(ch, sizeof(ch));

			db.ReKey(buffer);
			db.Close();
		}
	}
	catch (const wxSQLite3Exception& e)
	{
		wxLogDebug(e.GetMessage());
	}