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