wxWidgets教程(17)——wxSqlite3用法
阿新 • • 發佈:2019-02-05
一、編譯安裝
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()); }