记录QT SQLite3
如下讨论关于Qt进行SQLite的基本操作。
转自:https://www.cnblogs.com/lvdongjie/p/7068530.html
添加数据库驱动、设置数据库名称、数据库登录用户名、密码
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("database.db");
database.setUserName("root");
database.setPassword("123456");
打开数据库
if(!database.open())
{
qDebug() << database.lastError();
qFatal("failed to connect.") ;
}
else
{
//QSqlQuery类提供执行和操作的SQL语句的方法。
//可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE,
//以及DDL(数据定义语言)语句,例如CREATE TABLE。
//也可以用来执行那些不是标准的SQL的数据库特定的命令。
QSqlQuery sql_query;
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
QString select_max_sql = "select max(id) from student";
QString insert_sql = "insert into student values (?, ?, ?)";
QString update_sql = "update student set name = :name where id = :id";
QString select_sql = "select id, name from student";
QString select_all_sql = "select * from student";
QString delete_sql = "delete from student where id = ?";
QString clear_sql = "delete from student";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{
qDebug() << sql_query.lastError();
}
else
{
qDebug() << "table created!";
}
查询最大id
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
while(sql_query.next())
{
max_id = sql_query.value(0).toInt();
qDebug()<< QString("max id:%1").arg(max_id);
}
}
插入数据
sql_query.prepare(insert_sql);
sql_query.addBindValue(max_id+1);
sql_query.addBindValue("name");
sql_query.addBindValue(25);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
qDebug()<< "inserted!";
}
更新数据
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", 1);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
qDebug()<< "updated!";
}
查询部分数据
if(!sql_query.exec(select_sql))
{
qDebug()<< sql_query.lastError();
}
else
{
while(sql_query.next())
{
int id = sql_query.value("id").toInt();
QString name = sql_query.value("name").toString();
qDebug()<< QString("id:%1 name:%2").arg(id).arg(name);
}
}
查询所有数据
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
while(sql_query.next())
{
int id = sql_query.value(0).toInt();
QString name = sql_query.value(1).toString();
int age = sql_query.value(2).toInt();
qDebug()<< QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
}
删除数据
sql_query.prepare(delete_sql);
sql_query.addBindValue(max_id);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
qDebug()<< "deleted!";
}
清空表
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
qDebug()<< sql_query.lastError();
}
else
{
qDebug()<< "cleared";
}
关闭数据库
database.close();
删除数据库
QFile::remove("database.db");
带有加密功能的 SQLite Qt 插件(v0.5)
以下转自:https://www.devbean.net/2016/05/qt-sqlite-plugin-with-encryption-v05/
QtCipherSqlitePlugin 是一个能够加密 SQLite 数据的 Qt 插件,经过之前几个版本的更新,现在已经有不少使用。
经过这一次的调整,编译插件变得非常简单:只需要使用 QtCreator 打开插件中 sqlitecipher 文件夹下的 sqlitecipher.pro 进行编译即可。编译后,需要将生成的 sqlitecipher.dll 复制到 Qt 的 plugins/sqldrivers 文件夹下。本次更新。豆子使用 Qt 5.5 和 Qt 5.7 进行了测试,如果有其它版本的 Qt 不能正常使用,请及时联系豆子。
当然,本次更新我们还是使用了 SQLITECIPHER 作为插件的名字。如果需要修改这个名字,Qt4 需要修改 smain.cpp 中的 DriverName 定义,Qt5 需要修改 SqliteCipherDriverPlugin.json 中的 SQLITECIPHER 一行。
出去上述调整,更为重要的是,本次更新增加了很多新功能,包括为原来没有密码的 SQLite 数据库添加密码,修改数据库密码以及删除密码。下面我们将着重介绍这些功能的使用。
检查 QtCipherSqlitePlugin 是否成功加载
我们可以使用下面的代码检查 QtCipherSqlitePlugin 是否成功加载:
qDebug() << QSqlDatabase::drivers();
如果输出中有 SQLITECIPHER 的名字,那么恭喜你,插件没有问题!
为没有加密的数据库增加密码
Qt 默认提供的 SQLite 插件是没有加密功能的。新版本的 QtCipherSqlitePlugin 支持为原本没有加密的数据库增加密码,使用方法如下:
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 将使用改密码为这个数据库进行加密。
删除数据库密码
QtCipherSqlitePlugin 可以删除数据库密码,此时需要提供原密码,并使用连接选项QSQLITE_REMOVE_KEY,如下:
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);
}
更新数据库密码
QtCipherSqlitePlugin 可以更新数据库原有密码,需要设置原密码,并且使用连接选项QSQLITE_UPDATE_KEY设置新密码,具体代码如下:
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=,则作用等同于删除密码。
如果需要,可以到 github 上面获取 git 库,checkout 代码的 0.5 标签即可。
GITHUB:https://github.com/devbean/QtCipherSqlitePlugin
SQLite的管理
管理工具挺多的,这里简单介绍几款:
SQLite Manager:开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
SQLite Administrator:一个用来管理SQLite数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。
SQLite Database browser:一个SQLite数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。