Qt中使用SQLite

Qt中使用SQLite

​SQLite 是一款开源轻量级的数据库软件,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎,是在世界上最广泛部署的 SQL 数据库引擎,源代码不受版权限制。可以集成在其他软件中,应用十分方便。虽然是一款轻量级的数据库,但也可以满足很多应用场景。

​Qt中对应数据库的模块为Qt SQL,Qt SQL模块使用数据库驱动插件来和不同的数据库接口进行通信,由于Qt SQL模块的接口是独立于数据库的,所以所有数据库特定的代码都包含在这些驱动中。

1. 概述

数据库的基本操作可以用常说的的 CRUD 来概括,即:

  • C:Create增加对应CREATE TBL ...;
  • R:Retrieve查询SELECT * from TBL;
  • U:Update修改UPDATE TBL ..SET ...;
  • D:Delete删除DELETE FROM TBL WHERE ....;

在本文中除了介绍在Qt中使用SQLite数据库的基本操作外,还会展示使用数据库储存数据后,快速查询与修改目标信息的优势

在文章示例中,关于数据库操作的类为SqliteOperator,数据库对象为全局变量:

QSqlDatabase db;

2. 数据库基本操作

2.1 建立数据库

void SqliteOperator::CreatDb()
{
    if(QSqlDatabase::contains("qt_sql_default_connection"))
    {
        db = QSqlDatabase::database("qt_sql_default_connection");
    }
    else
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("test.db");
        db.setUserName("test");
        db.setPassword("test");
    }
}
  1. 建立数据库的第一步是要判断该数据库对象的连接是否已经存在,若已经存在则直接获取该对象即可。
  2. 每个数据库连接都存在一个连接名称,qt_sql_default_connection为默认连接名称,实际使用中,这个连接名称可以自己指定,指定方法为通过QSqlDatabase::addDatabase的第二个参数指定。第一个参数中的QSQLITE表示使用SQLite数据库。
  3. setDatabaseName用于指定数据库文件名
  4. setUserName setPassword设置用户名和密码可自定义,也可忽略

2.2 打开数据库

bool SqliteOperator::OpenDb()
{
    if(!db.open())
    {
        qDebug() << "Error: Failed to connect database." << db.lastError();
        return false;
    }

    return true;
}

2.3 关闭数据库

void SqliteOperator::CloseDb()
{
    db.close();
}

2.4 创建数据表

void SqliteOperator::CreateTable()
{
    QSqlQuery sql_query;
    QString creat_sql = "create table student (id int primary key, name varchar(30), age int)";
    sql_query.prepare(creat_sql);
    if(!sql_query.exec())
    {
        qDebug() << "Error: Fail to create table." << sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }
}
  • 对数据库进行操作需要用到QSqlQuery类,操作前必须定义一个对象。

  • 创建表格语句:create table (f1 type1, f2 type2,…);

  • QSqlQuery类在使用过程中有两种方式:(后边使用QSqlQuery类时等同)

    1. 直接把语句写在exec()

      sql_query.exec("create table student (id int primary key, name varchar(30), age int)");
      
    2. 分步写,利用prepare()函数,再使用exec()

2.5 插入数据

void SqliteOperator::InsertData()
{
    QString insert_sql = "insert into student values (?, ?, ?)";
    QSqlQuery sql_query;
    sql_query.prepare(insert_sql);
	sql_query.addBindValue(GetMaxId() +1);
    sql_query.addBindValue("Wang");
    sql_query.addBindValue(25);
    if(!sql_query.exec())
    {
    	qDebug() << sql_query.lastError();
    }
    else
    {
    	qDebug() << "inserted Wang!";
    }

}

  • 插入语句:insert into values (value1, value2,…);

2.6 更新/修改数据

void SqliteOperator::UpdateData()
{
    QString update_sql = "update student set name = :name where id = :id";
    QSqlQuery sql_query;
    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!";
    }
}
  • 语句:update <table_name> set <f1=value1>, <f2=value2>… where <expression>;

2.7 查询数据——遍历查询、条件查询

2.7.1 遍历查询

void SqliteOperator::QueryAllData()
{
    QString select_all_sql = "select * from student";
    QSqlQuery sql_query;
    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);
        }
    }
}

  • 查询部分 select <f1>, <f2>, ... from <table_name>;
  • 查询所有 select * from <table_name>;

2.7.2 条件查询

void SqliteOperator::QueryData()
{
    QString select_sql = QString("select * from student where name = '%1' and (age = '%2' or age = '%3')")
            .arg("Wang")
            .arg(30)
            .arg(25);
    QSqlQuery sql_query;
    if(!sql_query.exec(select_sql))
    {
        qDebug()<<sql_query.lastError();
    }
    else
    {
        while(sql_query.next())
        {
            int id = sql_query.value(0).toInt();
            QString name = sql_query.value(1).toString();
            qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);
        }
    }
}
  • 语句中and or表示逻辑关系

3. 条件查询与遍历查询的对比

加循环建了一个包含229300条数据,7448kb的数据库。

条件查询耗时:30ms

遍历查询耗时:100ms

随着数据量的增加,差距应该会更明显。

  • 13
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值