当前位置: 首页 > article >正文

QT6实现创建与操作sqlite数据库(一)

一.Qt为SQL数据库提供支持的基本模块(Qt SQL)

   Qt SQL的API分为不同层:

   驱动层

   SQL API层

   用户接口层

1.驱动层

   对于Qt 是基于C++来实现的框架,该层主要包括QSqlDriver,QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlugin,and QSqlResult.这一层提供了特定数据和SQLAPI层之间的底层桥梁。

2.SQL API层

   对于SQL API层提供了数据库的访问相关类,其中,QSqlDatabase类进行连接,QSlqQuery可以完成于数据库的交互。除此之外,包括了还提供了QSqlError,QSqlField,QSqlIndex,and QSqlRecord类。

3.用户接口层

   用户接口层的几个类实现了将数据库中的数据链连接到窗口部件上,这些类是使用模型/试图框架实现的,它们是更高层次的抽象,主要包括QSqlQueryModel,QSqlTableModel,andQSqlRelationalTableModel.

4.Qt SQL模块对数据库类

在Qt中为SQL数据库提供驱动程序层、SQL API层和用户界面,其提供主要类的简要功能说明见下表:

二.SQLite数据库操作流程

   第一步:在项目管理文件(.pro)中,增加数据库模块:QT    += sql

   第二步:查看Qt对数据库的驱动的类型的支持

   第三步:连接数据库,打开数据库

   第四步:访问数据库,读写操作

   第五步:关闭数据库

三.代码示例

1.查看Qt对数据库的驱动的类型的支持

  1. 代码

#include <QApplication>

#include <QSqlDatabase>

#include <QDebug>

#include <QStringList>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    qDebug() << "Available drivers:";

    QStringList drivers = QSqlDatabase::drivers();

    foreach(QString driver, drivers)

        qDebug() << driver;

    return a.exec();

}

(2)执行结果

2.Qt读写Sqlite数据库

Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery、QSqlQueryModel、QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更厉害,甚至第三种QSqlTableModel,根本就不需要开发者懂SQL语言,也能操作Sqlite数据库。

下面示例采用QSqlQuery方法实现数据库操作。

(1)widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QSqlError>

#include <QSqlQueryModel>

#include <QSqlRelationalTableModel>

#include <QSqlRelationalTableModel>

#include <QTableView>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

    Q_OBJECT

public:

    explicit Widget(QWidget *parent = nullptr);

    ~Widget();

private:

    Ui::Widget *ui;

    QSqlTableModel *model;

};

#endif // WIDGET_H

(2)widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QSqlDatabase>

#include <QDebug>

#include <QSqlQuery>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    //1.创建与打开数据库

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("dataset.db");

    if(!db.open())

    {

        qDebug() << "创建失败   " << db.lastError();

    }

    else

    {

        qDebug() << "创建成功";

    }

    //2.创建表

    QSqlQuery sql_query;

    QString create = "create table student(id int,name varchar(20),age int)";

    sql_query.prepare(create);

    sql_query.exec();

    //32.插入数据

    QString insert_sql = "insert into student values(?,?,?)" ;

    sql_query.prepare(insert_sql);

    sql_query.addBindValue(1);

    sql_query.addBindValue("Tom");

    sql_query.addBindValue(15);

    if(!sql_query.exec())

    {

        qDebug() << "插入执行错误: " << sql_query.lastError();

    }

    else {

        qDebug() << "插入成功";

    }

    //4.读取数据库表全部内容

    QString select_sql = "select * from student";

    sql_query.prepare(select_sql);

    if(!sql_query.exec())

    {

        qDebug() << "查看执行错误: " << sql_query.lastError();

    }

    else {

        while(sql_query.next())//如果下一行数据还存在,就继续执行

        {

            int id = sql_query.value(0).toInt();//将sql里的int转换为qt里的int

            QString name = sql_query.value(1).toString();//将sql里的string转化为qt里的string

            int age = sql_query.value(2).toInt();

            qDebug() << "id " << id << "  name: " << name << "  age: " << age;

        }

    }

    //5.更新数据内容

    QString update_sql = "update student set name =:nm where id =:n";

    sql_query.prepare(update_sql);

    sql_query.bindValue(":nm","TTTs");

    sql_query.bindValue(":n", "1");

    if(!sql_query.exec())

    {

        qDebug() << "更新失败" << sql_query.lastError();

    }

    else {

        qDebug() << "更新成功";

    }

    //6.再次读取数据内容

    select_sql = "select * from student";

    sql_query.prepare(select_sql);

    if(!sql_query.exec())

    {

        qDebug() << "查看执行错误: " << sql_query.lastError();

    }

    else {

        while(sql_query.next())//如果下一行数据还存在,就继续执行

        {

            int id1 = sql_query.value(0).toInt();//将sql里的int转换为qt里的int

            QString name1 = sql_query.value(1).toString();//将sql里的string转化为qt里的string

            int age1 = sql_query.value(2).toInt();

            qDebug() << "id " << id1 << "  name: " << name1 << "  age: " << age1;

        }

    }

    //7.删除数据内容

    QString delete1_sql = "delete from student where id = 1";

   // QString delete1_sql = "delete from student";

    sql_query.prepare(delete1_sql);

    if(!sql_query.exec())

    {

        qDebug() << "删除失败";

        qDebug() << sql_query.lastError().text();

    }

    else {

        qDebug() << "删除成功";

    }

}

Widget::~Widget()

{

    delete ui;

}

(3)执行结果:


http://www.kler.cn/a/273904.html

相关文章:

  • 基于springboot的网上商城购物系统
  • C++语言的面向对象编程
  • 对快速由表及里说拜拜/如何正确运用由表及里
  • Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
  • Ubuntu 下载安装 kibana8.7.1
  • HCIA-Access V2.5_8_2_EPON基本架构和关键参数
  • 【ZooKeeper】1、基本介绍
  • 计算机网络的组成
  • Linux下安装多个nodejs并映射Jenkins
  • 【HTTP】面试题整理
  • 5.1.7.1、【AI技术新纪元:Spring AI解码】Mistral AI函数调用
  • PHP反序列化--_wakeup()绕过
  • 蓝桥杯刷题(十一)
  • 面试算法-52-对称二叉树
  • C语言 实用调试技巧
  • python循环结构
  • 面试经典150题(114-118)
  • Java后端八股----JVM篇
  • python入门(二)
  • jQuery+CSS3自动轮播焦点图特效源码
  • c++ 正则表达式处理语言文本,根据标点符号分割句子
  • Java编程——赌数游戏
  • 使用 CSS 实现毛玻璃效果
  • centos防火墙firewall-cmd限定特定的ip访问
  • 算法笔记p154最大公约数和最小公倍数
  • 面向对象编程练习