QT SQLite 笔记


记录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数据库的工具,使用向导方式实现。


文章作者: KMCU
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KMCU !
评论
  目录