Set Connect options
- Provided by Qt SqlitePlugin
- QSQLITE_BUSY_TIMEOUT
- QSQLITE_OPEN_READONLY
- QSQLITE_OPEN_URI
- QSQLITE_ENABLE_SHARED_CACHE
- Added by QtCipherSqlitePlugin
- QSQLITE_CREATE_KEY
- QSQLITE_UPDATE_KEY
- QSQLITE_REMOVE_KEY
创建数据库密码 QSQLITE_CREATE_KEY
如果输出中有 SQLITECIPHER
的名字,那么恭喜你,插件没有问题!
为没有加密的数据库增加密码
Qt 默认提供的 SQLite 插件是没有加密功能的。新版本的 QtCipherSqlitePlugin
支持为原本没有加密的数据库增加密码,使用方法如下:
C++
1 2 3 4 5 6 7 8
| QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER"); dbconn.setDatabaseName("test.db"); dbconn.setPassword("test"); dbconn.setConnectOptions("QSQLITE_CREATE_KEY"); if (!dbconn.open()) { qDebug() << "Can not open connection: " << dbconn.lastError().driverText(); exit(CONNECTION_FAILED); }
|
上面的代码,我们使用 test.db
数据库,将密码设置为 test,同时指定连接选项为 QSQLITE_CREATE_KEY
。此时,调用 open() 函数之后,QtCipherSqlitePlugin
将使用改密码为这个数据库进行加密。
删除数据库密码 QSQLITE_REMOVE_KEY
QtCipherSqlitePlugin
可以删除数据库密码,此时需要提供原密码,并使用连接选项 QSQLITE_REMOVE_KEY
,如下:
1 2 3 4 5 6 7 8
| QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER"); dbconn.setDatabaseName("test.db"); dbconn.setPassword("test"); dbconn.setConnectOptions("QSQLITE_REMOVE_KEY"); if (!dbconn.open()) { qDebug() << "Can not open connection: " << dbconn.lastError().driverText(); exit(CONNECTION_FAILED); }
|
更新数据库密码 QSQLITE_UPDATE_KEY
QtCipherSqlitePlugin
可以更新数据库原有密码,需要设置原密码,并且使用连接选项 QSQLITE_UPDATE_KEY
设置新密码,具体代码如下:
1 2 3 4 5 6 7 8
| QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER"); dbconn.setDatabaseName("test.db"); dbconn.setPassword("test"); dbconn.setConnectOptions("QSQLITE_UPDATE_KEY=newtest"); if (!dbconn.open()) { qDebug() << "Can not open connection: " << dbconn.lastError().driverText(); exit(CONNECTION_FAILED); }
|
如果原密码不正确,QtCipherSqlitePlugin
会直接返回错误。
如果新密码设置为空,例如 QSQLITE_UPDATE_KEY=
,则作用等同于删除密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| bool QUpdateDB::setDBConfig(QSqlDatabase* dbconn, QMap<ENUM_SQLKEY, QString> qMapCfg) { for (auto it : qMapCfg.toStdMap()) { if (it.first <= QSQLITE_REMOVE_KEY) { dbconn->setPassword(it.second); dbconn->setConnectOptions(GETOBJNAME(it.first)); } else if (it.first == QSQLITE_UPDATE_KEY) { dbconn->setPassword(it.second); dbconn->setConnectOptions(QString("%1=%2").arg().arg()); } } }
|