SQLITE 数据库增删改查

1、添加依赖

在.pro文件添加sql模块

cpp 复制代码
QT += sql

2、SqliteHelper头文件

cpp 复制代码
#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源文件

cpp 复制代码
#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函数

cpp 复制代码
{
	// 实例
    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();
        }      
    }
}
相关推荐
马尔代夫哈哈哈6 小时前
Spring IoC&DI
数据库·sql
液态不合群8 小时前
[特殊字符] MySQL 覆盖索引详解
数据库·mysql
一匹电信狗9 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
初次见面我叫泰隆9 小时前
Qt——3、常用控件
开发语言·qt·客户端
计算机毕设VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
瀚高PG实验室9 小时前
PostgreSQL到HighgoDB数据迁移
数据库·postgresql·瀚高数据库
Queenie_Charlie9 小时前
小陶的疑惑2
数据结构·c++·树状数组
打码人的日常分享10 小时前
智能制造数字化工厂解决方案
数据库·安全·web安全·云计算·制造
三水不滴10 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
无小道10 小时前
Qt——QWidget
开发语言·qt