欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wxWidgets教程(17)——wxSqlite3用法

程序员文章站 2022-06-09 09:29:44
...

一、编译安装

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());
	}