SQLITE 数据库增删改查

news/2024/9/20 15:42:29

1、添加依赖
在.pro文件添加sql模块

QT += sql

2、SqliteHelper头文件

#pragma once

#include <QObject>
#include <QFile>
#include <QtSql>
#include <QMap>

class SqliteHelper
{
public:
    SqliteHelper();
    SqliteHelper(const QString& filePath);
    ~SqliteHelper();

    bool open(const QString& filePath);
    void close();

    bool createTable(const QString& sql);
    bool createTable(const QString& tableName, const QVariantMap& map);
    bool createTable(const QString& tableName, const QVariantHash& map);
    bool deleteTable(const QString& tableName);

    bool insertData(const QString& tableName, const QVariantMap& map);
    bool updateData(const QString& tableName, const QVariantMap& map, const QString& condition);
    bool deleteData(const QString& tableName, const QString& condition);

    QList<QVariantMap> queryData(const QString& tableName);

    bool beginTransaction();
    bool commitTransaction();
    bool rollbackTransaction();

private:

    bool execute(const QString& sql);
private:
    QSqlDatabase m_db;
};

3、SqliteHelper源文件

#include "SqliteHelper.h"

SqliteHelper::SqliteHelper()
{

}

SqliteHelper::SqliteHelper(const QString& filePath)
{
    m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName(filePath);

    if (!m_db.open())
    {
        qDebug() << "Failed to open database.";// 处理数据库打开错误
    }
}

SqliteHelper::~SqliteHelper()
{
    if (m_db.isOpen())
    {
        m_db.close();
    }
}

bool SqliteHelper::open(const QString& filePath)
{
    if (!m_db.isOpen())
    {
        m_db = QSqlDatabase::addDatabase("QSQLITE"); // QSQLITE
        m_db.setDatabaseName(filePath);

        if (!m_db.open())
        {
            qDebug() << "Failed to open database.";// 处理数据库打开错误
            return false;
        }
    }
    return true;
}

void SqliteHelper::close()
{
    if (m_db.isOpen())
    {
        m_db.close();
    }
}

bool SqliteHelper::createTable(const QString& sql)
{
    return execute(sql);
}

bool SqliteHelper::createTable(const QString& tableName, const QVariantMap& map)
{
    QStringList key_value;
    key_value.clear();
    for (const QString& key : map.keys())
    {
        key_value.append(key + " " + map[key].toString());
    }
    // deleteTable(tableName);
    QString sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + key_value.join(", ") + ")";
    return execute(sql);
}

bool SqliteHelper::createTable(const QString& tableName, const QVariantHash& map)
{
    QStringList key_value;
    key_value.clear();
    for (const QString& key : map.keys())
    {
        key_value.append(key + " " + map[key].toString());
    }

    //deleteTable(tableName);

    QString sql = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + key_value.join(", ") + ")";
    return execute(sql);
}

bool SqliteHelper::deleteTable(const QString& tableName)
{
    // DROP TABLE IF EXISTS [table_name];
    QString sql = QString("DROP TABLE IF EXISTS '%1'").arg(tableName);
    return execute(sql);
}

bool SqliteHelper::execute(const QString& sql)
{
    QSqlQuery sqlQuery(m_db);
    return sqlQuery.exec(sql);
}

bool SqliteHelper::insertData(const QString& tableName, const QVariantMap& map)
{
    QStringList keys;
    QStringList values;

    for (const QString& key : map.keys())
    {
        keys.append(key);
        values.append("'" + map[key].toString() + "'");
    }

    QString query = "INSERT INTO " + tableName + "(" + keys.join(", ") + ")" + " VALUES (" + values.join(", ") + ")";

    return execute(query);
}

bool SqliteHelper::updateData(const QString& tableName, const QVariantMap& map, const QString& condition)
{
    QStringList updates;

    for (const QString& key : map.keys())
    {
        updates.append(key + " = '" + map[key].toString() + "'");
    }
    QString sql = "UPDATE " + tableName + " SET " + updates.join(", ") + " WHERE " + condition;

    return execute(sql);
}

bool SqliteHelper::deleteData(const QString& tableName, const QString& condition)
{
    QString query = "DELETE FROM " + tableName + " WHERE " + condition;
    return execute(query);
}


QList<QVariantMap> SqliteHelper::queryData(const QString& tableName)
{
    QList<QVariantMap> records;

    if (!m_db.isOpen())
    {
        qDebug() << "Failed to open database.";
        return records;
    }

    // 执行查询操作
    QSqlQuery query(m_db);
    QString sql = QString("SELECT * FROM %1").arg(tableName);
    if (!query.exec(sql))
    {
        qDebug() << "Failed to execute query.";
        return records;
    }

    // 遍历结果集,将每条记录存储为 QVariantMap 并添加到列表中
    while (query.next())
    {
        QVariantMap record;
        QSqlRecord rec = query.record();
        int count = rec.count();

        for (int i = 0; i < count; ++i)
        {
            QString fieldName = rec.fieldName(i);
            QVariant value = rec.value(i);
            record[fieldName] = value;
        }

        records.append(record);
    }

    return records;
}


bool SqliteHelper::beginTransaction()
{
    return m_db.transaction();
}

bool SqliteHelper::commitTransaction()
{
    return m_db.commit();
}

bool SqliteHelper::rollbackTransaction()
{
    return m_db.rollback();
}


4、main函数

{
	// 实例
    SqliteHelper sqlite("test.db");

    // 表名
    QString tableName("students");

    // 创建测试表    
    // 1
    QString sql = "CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, city TEXT)";
    //sqlite.createTable(sql);

    // 2
    //sqlite.deleteTable(tableName);
    QVariantMap tableHeader;
    tableHeader["id"] = "INTEGER PRIMARY KEY";
    tableHeader["name"] = "TEXT";
    tableHeader["age"] = "INTEGER";
    tableHeader["city"] = "TEXT";
    sqlite.createTable(tableName, tableHeader);

    // 3
    //QVariantHash tableHeader;
    //tableHeader["id"] = "INTEGER PRIMARY KEY";
    //tableHeader["name"] = "TEXT";
    //tableHeader["age"] = "INTEGER";
    //tableHeader["city"] = "TEXT";
    //sqlite.createTable(tableName, tableHeader);


    // 插入一条记录
    QVariantMap data;
    data["name"] = "gg";
    data["age"] = 22;
    data["city"] = "beijing";
    sqlite.insertData(tableName, data);

    // 更新记录
    QVariantMap updatedata;
    //updatedata["name"] = "lisi";
    updatedata["age"] = 32;
    updatedata["city"] = "shanghai";
    sqlite.updateData(tableName, updatedata, "name = 'gg'"); // 通过name修改
    //sqlite.updateData(tableName, updatedata, "id = 1"); // 通过id修改

    // 删除记录
    //sqlite.deleteData("students", "id = 1"); // 通过id删除
    sqlite.deleteData("students", "city = 'shanghai'"); // 通过idcity

    // 查询记录
    //QSqlQuery query(sqlite.m_db);
    //query.exec("SELECT * FROM students");
    //while (query.next())
    //{
    //    int id = query.value("id").toInt();
    //    QString name = query.value("name").toString();
    //    QString city = query.value("city").toString();
    //    int age = query.value("age").toInt();

    //    qDebug() << "id:" << id 
    //        << ", name:" << name 
    //        << ", age:" << age
    //        << ", city:" << city;
    //}


    //调用接口--查询记录
    QList<QVariantMap> mapList = sqlite.queryData(tableName);
    // 遍历结果
    int i = 0;
    for (const QVariantMap& record : mapList)
    {
        qDebug() << "-------------------------------->" + QString::number(++i);
        for (const QString& key : record.keys())
        {
            qDebug() << key + " " + record[key].toString();
        }      
    }
}

http://lihuaxi.xjx100.cn/news/1595720.html

相关文章

Go 语言高级网络编程

深入探讨 Go 语言的网络编程 简介 Go&#xff08;Golang&#xff09;中的网络编程具有易用性、强大性和乐趣。本指南深入探讨了网络编程的复杂性&#xff0c;涵盖了协议、TCP/UDP 套接字、并发等方面的内容&#xff0c;并附有详细的注释。 关键概念 1. 网络协议 TCP&#x…

table表格初始化根据字段数字排序,table表格进入后返回上一级设置,第一级隐藏

根据字段数字排序 // 初始化表格数据 const getTableData async () > {try {loading.value trueconst res await getFileList() //排序const sortedData computed(() > {return res.slice().sort((a: any, b: any) > a.documentType - b.documentType);});tableD…

​​金TECH频道|最近备受关注的应用重构,到底怎么做?

“金TECH频道”旨在为您分享中电金信助力行业数字化转型的最新产品业务动态、技术观点洞察与应用实践案例。让我们在这里&#xff0c;与行业发展同频共振&#xff0c;共筑数字新基石。 ​​

大数据软件项目的验收流程

大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目验收计划制定&#xff1a; 在…

mac m1打开word或excel显示VB运行时错误53,怎么解决这个问题,亲测有效!

mac m1打开word或excel或ppt时显示VB运行时错误53,每次都要点击多次,才能结束,用起来非常不方便,很麻烦,那么怎么解决这个问题呢,为大家献上,亲测有效! 如上图 非常简单 选择工具 找到模板加载项 如下图 点进去哈 接下来进入到以下画面

机器学习基础-数据分析:房价预测

mac设置中文字体 #要设置下面两行才能显示中文 Arial Unicode MS 为字体 plt.rcParams[font.sans-serif] [Arial Unicode MS] #设置图片大小 plt.figure(figsize(20, 11), dpi200)pie官方文档 总体代码 python import pandas as pd import numpy as np import matplotlib.…

QMC5883L-磁力计椭球拟合校准

1.概述 磁力计椭球拟合校准是一种将磁力计测量数据校准到真实磁场的技术。这种技术通常使用椭球模型来拟合磁力计的测量结果&#xff0c;然后通过最小二乘法来找到拟合参数的最优解。 2.总体思想 磁力计椭球拟合校准的思想包括以下几个步骤&#xff1a; 1.数据预处理&#x…

【STM32单片机】数学自动出题器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、IIC OLED模块等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED液晶显示出题器开机界面&#xff0c;默认结果范围为100&#xff0c;可按…