Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释)

Qt数据库练习之Qt SQLITE的使用(从无到有,含源码+注释),第1张

一、 *** 作示例

提示:查询所有记录和条件查询在 *** 作中有,就不单独示例了;源码在本文第三节(源码含详细注释)。

1.1 创建数据表

下图为创建数据表的 *** 作,其步骤分为:

  1. 确保当前没有数据表
  2. 创建数据表
  3. 查看数据表是否创建成功
  4. 查看初始化数据是否成功
1.2 添加记录(数据)

下图为添加记录的 *** 作,其步骤分为:

  1. 查看学生信息表当前内容
  2. 添加学生信息
  3. 使用条件查询查询添加的记录(若有则添加成功)
二、了解SQLITE
  1. 因为是sql *** 作,所以需要在pro文件添加“QT += sql”;
  2. SQLITE是一款开源轻量级的数据库软件,它不需要服务器,也不用进行配置就能使用的数据库;
  3. SQLITE在使用时无需指定主机名、用户名、密码、端口号等信息,仅指定数据库即可;
三、源码

提示:源码中的槽函数都是通过ui文件的转到槽功能添加,所有没有连接信号槽的代码

3.1 CDBTest.h
#ifndef CDBTEST_H
#define CDBTEST_H

#include 
#include 

namespace Ui {
class CDBTest;
}

class CDBTest : public QMainWindow
{
    Q_OBJECT

public:
    explicit CDBTest(QWidget *parent = 0);
    ~CDBTest();

    //! 代码复用的函数
    //! 在条件查询和普通查询中的部分代码相同,完全可以封装成一个函数使用;
    //! 细心的小伙伴会发现,其实条件查询和普通查询完全可以写成一个函数,有兴趣的话可以试试。
    void displayRecord(QSqlQuery query);

private slots:
    void on_showTablesBt_clicked(); //显示所有表

    void on_selectAllBt_clicked();  //普通查询:查询表中所有信息

    void on_selectWhereBt_clicked();    //条件查询

    void on_addInfoBt_clicked();    //添加记录

    void on_createTableBt_clicked();    //创建数据表

private:
    Ui::CDBTest *ui;

    QSqlDatabase m_sqliteDB;     //sqlite数据库对象

};

#endif // CDBTEST_H

3.2 CDBTest.cpp
#include "CDBTest.h"
#include "ui_CDBTest.h"
#include 
#include 
#include 
#include 
#include 
#include 

CDBTest::CDBTest(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CDBTest)
{
    ui->setupUi(this);
    this->setWindowTitle("QSQLITE练习");

    //指定数据库类型
    m_sqliteDB = QSqlDatabase::addDatabase("QSQLITE");
    //指定数据库(若是数据库不存在,会自动创建,不过记得带后缀名哦)
    m_sqliteDB.setDatabaseName("./test.db");
    if(!m_sqliteDB.open())
    {
        ui->textBrowser->append(m_sqliteDB.lastError().text());
        return;
    }
}

CDBTest::~CDBTest()
{
    delete ui;
}

void CDBTest::displayRecord(QSqlQuery query)
{
    //获取一个记录对象
    QSqlRecord rec =  query.record();
    QString columTitle(""); //用于组列标题的变量
    for(int index = 0; index != rec.count(); ++index)
    {
        //循环获取每个列标题,并添加到列标题字符串中
        columTitle.append(rec.fieldName(index) + "\t");
    }
    //将列标题添加到显示控件中
    ui->textBrowser->append(columTitle);

    //循环获取每条记录
    while (query.next())
    {
        //将当前记录的数据组成字符串,然后添加到显示控件中
        QString record("");
        record.append(query.value(0).toString() + "\t");
        record.append(query.value(1).toString() + "\t");
        record.append(query.value(2).toString() + "\t");
        record.append(query.value(3).toString() + "\t");
        ui->textBrowser->append(record);
    }

    ui->textBrowser->append("=========================Run successfully=======================\n");
}

void CDBTest::on_showTablesBt_clicked()
{
    ui->textBrowser->append("数据库中的所有表如下:");
    foreach (QString table, m_sqliteDB.tables())
    {
        ui->textBrowser->append(table);
    }
    ui->textBrowser->append("=========================Run successfully=======================\n");
}

void CDBTest::on_selectAllBt_clicked()
{
    QSqlQuery query;
    ui->textBrowser->append("StudentsInfo:");

    //运行sql语句并判断是否运行成功
    bool flag = query.exec("select * from StudentsInfo");
    if(!flag)
    {
        ui->textBrowser->append(query.lastError().text());
        return;
    }

    //调用显示函数显示记录
    displayRecord(query);
}

void CDBTest::on_selectWhereBt_clicked()
{
    QSqlQuery query;
    ui->textBrowser->append("StudentsInfo [age > 18]:");

    //运行sql语句并判断是否运行成功
    bool flag = query.exec("select * from StudentsInfo where age > 18");
    if(!flag)
    {
        ui->textBrowser->append(query.lastError().text());
        return;
    }

    //调用显示函数显示记录
    displayRecord(query);
}

void CDBTest::on_addInfoBt_clicked()
{
    //当没有学号和姓名时不能添加
    if(ui->sIdEdit->text().isEmpty() || ui->nameEdit->text().isEmpty())
        return;

    QSqlQuery query;
    //组sql语句,并将对用控件的值插入
    QString sql = QString("insert into StudentsInfo values('%1', '%2', %3, %4)")
            .arg(ui->sIdEdit->text())
            .arg(ui->nameEdit->text())
            .arg(ui->ageSpinBox->value())
            .arg(ui->heightSpinBox->value());

    if(query.exec(sql))
        ui->textBrowser->append(query.lastError().text());

    ui->textBrowser->append("=========================Run successfully=======================\n");
}

void CDBTest::on_createTableBt_clicked()
{
    QSqlQuery query;
    //创建表的SQL语句
    QString sql = "create table StudentsInfo("
                  "id vchar primary key,"
                  "name vchar,"
                  "age int,"
                  "height int)";

    //运行并判断是否创建成功
    if(!query.exec(sql))
    {
        ui->textBrowser->append(query.lastError().text());
        return;
    }

    //为数据表初始化数据,方便做查询 *** 作
    sql = "insert into StudentsInfo values('%1', '学生%2', %3, %4)";
    srand(QDateTime::currentMSecsSinceEpoch()); //设置随机数的基数
    for(int index = 1; index != 4; ++index)
    {
        QString sqlTemp = sql
                //! 含义 字符,字符位数,字符进制,当字符比字符位数少时指定的补位字符
                //! 如我这里的补位字符为'0'
                .arg(index, 3, 10, QLatin1Char('0'))
                .arg(index)
                .arg(rand() % 40).arg(rand() % 300);
        query.exec(sqlTemp);
    }
    ui->textBrowser->append("=========================Created successfully=======================\n");
}

总结

源码包含创建数据库(虽然没看出来,但这个数据库其实是自动创建的)、创建数据表、添加记录、查询记录等 *** 作;当然了其中难免有一些BUG,比如创建、查询等功能已经写死了,不能有更灵活的 *** 作,有兴趣的小伙伴可以试着补全。强烈刚开始学习Qt的小伙伴可以做这个练习。
对于SQLITE,在考虑不能接网、考虑电脑性能、便携、配置问题等情况都可以使用哦。

相关文章

Qt数据库练习之QSqlQuery、QSqlQueryModel的简单使用(含源码+注释)
Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/867801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-12
下一篇 2022-05-12

发表评论

登录后才能评论

评论列表(0条)

保存