Qt从入门到入土(十) -数据库操作--SQLITE

发布于:2025-03-16 ⋅ 阅读:(12) ⋅ 点赞:(0)

认识

数据库是用于存储、管理和检索数据的系统化集合。它是一种按照特定结构组织数据的存储方式,通过软件(数据库管理系统,DBMS)来实现数据的高效存储、查询、更新和管理。通过文件存储数据适用于少量的数据,而当拥有几十万上百万条数据时,通过文件读写数据所耗的时间就非常长,因此当数据量很大时,就需要使用数据库来存储数据。本文主要介绍了SQLITE的用法。

导入数据库模块

在CMakeLists.txt文件中加入Sql模块

 

 如果使用qmake编译,则在.pro文件中加入以下代码

QT += core gui sql

 引用头文件QSqlDatabase查看模块是否导入成功

#include "mainwindow.h"

#include <QApplication>
#include <QSqlDatabase>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    qDebug()<<QSqlDatabase::drivers();   // 查看支持的驱动
    w.show();
    return a.exec();
}

打开数据库

void openDatabase()
{
    qDebug()<<QSqlDatabase::drivers();   // 查看支持的驱动
    // 添加数据库
    auto database = QSqlDatabase::addDatabase("QSQLITE");
    // 设置数据库名称
    database.setDatabaseName("student.db");
    // 打开数据库
    if(!database.open())
    {
        qDebug()<<database.databaseName()<<"open failed:"<< database.lastError();
        return;
    }
    qDebug()<<"打开数据库成功!";
}

打开数据库成功后会创建一个student.db的文件用于存放数据信息

创建表

// 创建表
    QSqlQuery query(database);   // 连接到database数据库上
    auto res = query.exec(R"(CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER))");
    // 判断表是否创建成功
    if(!res)
    {
        qDebug()<<query.lastError().text();
        return;
    }
    qDebug()<<"表创建成功!";

 SQL语句解读:

1. CREATE TABLE IF NOT EXISTS users

  • CREATE TABLE:这是 SQL 语句的开头,表示要创建一个新的表。

  • IF NOT EXISTS:这是一个可选的条件,用于检查表是否已经存在。如果表已经存在,则不会重复创建,避免了因重复创建表而导致的错误。

  • students:这是新表的名称,表示要创建一个名为 students 的表。

2. id INTEGER PRIMARY KEY AUTOINCREMENT

  • id:这是表中的一个字段名称,表示每个用户的唯一标识符。

  • INTEGER:这是字段的数据类型,表示 id 字段存储整数类型的数据。

  • PRIMARY KEY:这是一个约束,表示 id 字段是表的主键。主键用于唯一标识表中的每一行记录,不能有重复值。

  • AUTOINCREMENT:这是一个特殊的约束,表示 id 字段的值会自动递增。每次插入新记录时,如果未指定 id 的值,SQLite 会自动为该字段生成一个唯一的整数值。

3. name TEXT NOT NULL

  • name:这是表中的另一个字段名称,表示用户的姓名。

  • TEXT:这是字段的数据类型,表示 name 字段存储文本类型的数据。

  • NOT NULL:这是一个约束,表示 name 字段不能为空。在插入或更新数据时,必须为该字段提供一个值,否则会报错。

4. age INTEGER

  • age:这是表中的另一个字段名称,表示用户的年龄。

  • INTEGER:这是字段的数据类型,表示 age 字段存储整数类型的数据。

  • 没有约束:这里没有为 age 字段指定 NOT NULL 约束,因此 age 字段可以为空(即允许插入 NULL 值)。

查看字段

    // 查看当前数据库有哪些表
    qDebug()<<database.tables();
    // 查看表中字段
    QSqlRecord record = database.record("students");
    qDebug()<<"有"<<record.count()<<"个字段";
    for(size_t i = 0;i<record.count();++i)
    {
        qDebug()<<record.fieldName(i);
    }

插入数据

    // 只能作为初始化插入一次,否则会报错
    auto sql = R"(INSERT INTO students(id,name,age) VALUES (1,'张三',18),(2,'李四',20),(3,'王五',50);)";
    if(!query.exec(sql))
    {
        qDebug()<<"插入数据失败:"<<query.lastError();
        return;
    }
    // 插入固定数据(单条)
    int id = 5;
    QString name = "超人强";
    int age = 18;
    // 准备语句,使用?作为占位符
    if(!query.prepare(R"(INSERT INTO students(id,name,age) VALUES(?,?,?))"))
    {
        qDebug()<<"插入数据失败"<<query.lastError();
        return;
    }
    else
    {
        // 使用bindValue来绑定
        // query.bindValue(0,id);
        // query.bindValue(1,name);
        // query.bindValue(2,age);
        // 默认从0开始绑定
        query.addBindValue(id);
        query.addBindValue(name);
        query.addBindValue(age);
        if(!query.exec())
        {
            qDebug()<<"error"<<query.lastError();
        }
    }
    // 插入多条数据
    QVariantList id_list{7,8,9};
    QVariantList name_list{"猪猪侠","小猪猪","ggbond"};
    QVariantList age_list{18,18,18};
    if(!query.prepare(R"(INSERT INTO students(id,name,age) VALUES(?,?,?))"))
    {
        qDebug()<<"插入数据失败"<<query.lastError();
        return;
    }
    query.addBindValue(id_list);
    query.addBindValue(name_list);
    query.addBindValue(age_list);
    // 批量插入
    if(!query.execBatch())
    {
        qDebug()<<"批量插入失败"<<query.lastError();
        return;
    }

删除数据

    // 删除数据
    if(!query.exec(R"(DELETE FROM students WHERE id = 1)"))
    {
        qDebug()<<"数据删除失败!"<<query.lastError();
        return;
    }

修改数据

    // 修改数据
    if(!query.exec(R"(UPDATE students SET name = '王八蛋' WHERE name = '李四')"))
    {
        qDebug()<<"更新数据失败!"<<query.lastError();
        return;
    }

查询数据

    // 查询数据
    if(!query.exec("SELECT * FROM students"))
    {
        qDebug()<<"查询数据失败"<<query.lastError();
        return;
    }

打印数据

    // 打印全部数据
    while(query.next())
    {
        QSqlRecord record = query.record();
        qDebug()<<record.value("id")<<record.value("name")<<record.value("age");
    }

 测试代码

void test_database()
{
    qDebug()<<QSqlDatabase::drivers();   // 查看支持的驱动
    
    // 添加数据库
    auto database = QSqlDatabase::addDatabase("QSQLITE","connect");
    
    // 设置数据库名称
    database.setDatabaseName("student.db");
    
    // 打开数据库
    if(!database.open())
    {
        qDebug()<<database.databaseName()<<"open failed:"<< database.lastError();
        return;
    }
    qDebug()<<"打开数据库成功!";

    // 创建表
    QSqlQuery query(database);   // 连接到database数据库上
    auto res = query.exec(R"(CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER))");
    
    // 判断表是否创建成功
    if(!res)
    {
        qDebug()<<query.lastError().text();
        return;
    }
    qDebug()<<"表创建成功!";

    // 查看当前数据库有哪些表
    qDebug()<<database.tables();
    
    // 查看表中字段
    QSqlRecord record = database.record("students");
    qDebug()<<"有"<<record.count()<<"个字段";
    for(size_t i = 0;i<record.count();++i)
    {
        qDebug()<<record.fieldName(i);
    }

    // 插入数据
    // 只能作为初始化插入一次,否则会报错
    // auto sql = R"(INSERT INTO students(id,name,age) VALUES (1,'张三',18),(2,'李四',20),(3,'王五',50);)";
    // if(!query.exec(sql))
    // {
    //     qDebug()<<"插入数据失败:"<<query.lastError();
    //     return;
    // }
    
    // 插入固定数据(单条)
    int id = 5;
    QString name = "超人强";
    int age = 18;
    
    // 准备语句,使用?作为占位符
    if(!query.prepare(R"(INSERT INTO students(id,name,age) VALUES(?,?,?))"))
    {
        qDebug()<<"插入数据失败"<<query.lastError();
        return;
    }
    else
    {
        // 使用bindValue来绑定
        // query.bindValue(0,id);
        // query.bindValue(1,name);
        // query.bindValue(2,age);
        // 默认从0开始绑定
        query.addBindValue(id);
        query.addBindValue(name);
        query.addBindValue(age);
        if(!query.exec())
        {
            qDebug()<<"error"<<query.lastError();
        }
    }

    // 插入多条数据
    QVariantList id_list{7,8,9};
    QVariantList name_list{"猪猪侠","小猪猪","ggbond"};
    QVariantList age_list{18,18,18};
    if(!query.prepare(R"(INSERT INTO students(id,name,age) VALUES(?,?,?))"))
    {
        qDebug()<<"插入数据失败"<<query.lastError();
        return;
    }
    query.addBindValue(id_list);
    query.addBindValue(name_list);
    query.addBindValue(age_list);
    
    // 批量插入
    if(!query.execBatch())
    {
        qDebug()<<"批量插入失败"<<query.lastError();
        return;
    }
    
    // 删除数据
    if(!query.exec(R"(DELETE FROM students WHERE id = 1)"))
    {
        qDebug()<<"数据删除失败!"<<query.lastError();
        return;
    }
    
    // 修改数据
    if(!query.exec(R"(UPDATE students SET name = '王八蛋' WHERE name = '李四')"))
    {
        qDebug()<<"更新数据失败!"<<query.lastError();
        return;
    }
    
    // 查询数据
    if(!query.exec("SELECT * FROM students"))
    {
        qDebug()<<"查询数据失败"<<query.lastError();
        return;
    }
    
    // 打印全部数据
    while(query.next())
    {
        QSqlRecord record = query.record();
        qDebug()<<record.value("id")<<record.value("name")<<record.value("age");
    }
    
    // 关闭数据库
    database.close();
}

接口封装

#include <QApplication>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>

// 初始化数据库(创建表)
void initDatabase(QSqlQuery& q)
{
    auto sql = R"(CREATE TABLE IF NOT EXISTS manager(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER))";
    if(!q.exec(sql))
    {
        qDebug()<<"创建表失败!"<<q.lastError();
        return;
    }
    qDebug()<<"创建表成功!";
}

// 增加数据
void insertData(QVariant id,QVariant name,QVariant age,QSqlQuery& q)
{
    // 准备语句,使用?作为占位符
    if(!q.prepare(R"(INSERT INTO manager(id,name,age) VALUES(?,?,?))"))
    {
        qDebug()<<"插入数据失败"<<q.lastError();
        return;
    }
    else
    {
        // 插入单条数据
        q.addBindValue(id);
        q.addBindValue(name);
        q.addBindValue(age);
        if(!q.exec())
        {
            qDebug()<<"error"<<q.lastError();
            return;
        }
        qDebug()<<"插入数据成功!";
    }
}

// 删除数据
void deleteData(QVariant id,QSqlQuery& q)
{
    // 准备删除语句
    if (!q.prepare("DELETE FROM manager WHERE id = :id"))
    {
        qDebug() << "准备删除语句失败:" << q.lastError();
        return;
    }

    // 绑定参数
    q.bindValue(":id", id.toInt());

    // 执行删除操作
    if (!q.exec())
    {
        qDebug() << "数据删除失败!" << q.lastError();
        return;
    }

    qDebug() << "删除数据成功!";
}
// 修改数据
void modifyData(QSqlQuery& q,QVariant name,QVariant newName)
{
    // 修改数据
    if(!q.prepare("UPDATE manager SET name = :newName WHERE name = :name"))
    {
        qDebug()<<"准备更新数据失败!"<<q.lastError();
        return;
    }
    q.bindValue(":newName",newName.toString());
    q.bindValue(":name",name.toString());
    if(!q.exec())
    {
        qDebug()<<"更新数据失败!"<<q.lastError();
        return;
    }
    qDebug()<<"修改数据成功!";

}
// 查询数据
void searchData(QSqlQuery& q,QVariant name)
{
    // 查询数据
    if(!q.exec("SELECT * FROM manager"))
    {
        qDebug()<<"查询数据失败"<<q.lastError();
        return;
    }
    while(q.next())
    {
        QSqlRecord rec = q.record();
        if(name == rec.value("name"))
        {
            qDebug()<<"查询数据成功:"<<rec.value("id")<<rec.value("name")<<rec.value("age");
        }
    }
}
// 打印所有数据
void printData(QSqlQuery& q)
{
    // 执行查询语句
    if (!q.exec("SELECT * FROM manager")) {
        qDebug() << "查询失败:" << q.lastError();
        return;
    }

    while(q.next())
    {
        QSqlRecord rec = q.record();
        qDebug()<<rec.value("id")<<rec.value("name")<<rec.value("age");
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    auto db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("manager.db");
    if(!db.open())
    {
        qDebug()<<"数据库打开失败"<<db.lastError();
        return -1;
    }
    qDebug()<<"数据库创建成功!";
    QSqlQuery query(db);
    initDatabase(query);
    insertData(1,"张三",18,query);
    printData(query);
    deleteData(1,query);
    printData(query);
    modifyData(query,"张三","张无忌");
    printData(query);
    searchData(query,"张三");

    return a.exec();
}

网站公告

今日签到

点亮在社区的每一天
去签到