Qt и SQLite

Автор: | 21 декабря, 2023

Для подключения к базе данных SQLite и работы с ней в приложении на C++ с использованием библиотеки Qt, вы можете использовать класс QSqlDatabase из QtSql модуля. Ниже представлен пример кода, который демонстрирует подключение к базе данных SQLite, создание таблицы и выполнение базовых операций.

 

Рассмотрим небольшой пример:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>

// Функция для обработки сообщений
void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    Q_UNUSED(context);

    switch (type) {
    case QtDebugMsg:
        fprintf(stderr, "Debug: %s\n", msg.toUtf8().constData());
        break;
    case QtInfoMsg:
        fprintf(stderr, "Info: %s\n", msg.toUtf8().constData());
        break;
    case QtWarningMsg:
        fprintf(stderr, "Warning: %s\n", msg.toUtf8().constData());
        break;
    case QtCriticalMsg:
        fprintf(stderr, "Critical: %s\n", msg.toUtf8().constData());
        break;
    case QtFatalMsg:
        fprintf(stderr, "Fatal: %s\n", msg.toUtf8().constData());
        abort();
    }
}

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


    QCoreApplication a(argc, argv);

    qInstallMessageHandler(myMessageHandler);

    // Подключение к базе данных SQLite
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydatabase.db");

    if (!db.open()) {
        qDebug() << "Ошибка подключения к базе данных:" << db.lastError().text();
        return 1;
    }

    // Создание таблицы
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS Employees ("
               "  EmployeeID INT PRIMARY KEY,"
               "  FirstName VARCHAR(50),"
               "  LastName VARCHAR(50),"
               "  Salary DECIMAL(10, 2)"
               ")");

    // Вставка данных
    query.exec("INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary) "
               "VALUES (1, 'John', 'Doe', 50000.00)");

    // Выбор данных
    query.exec("SELECT FirstName, LastName, Salary FROM Employees WHERE Salary > 50000");
    while (query.next()) {
        QString firstName = query.value(0).toString();
        QString lastName = query.value(1).toString();
        double salary = query.value(2).toDouble();
        qDebug() << "Имя:" << firstName << "Фамилия:" << lastName << "Зарплата:" << salary;
    }

    // Обновление данных
    query.exec("UPDATE Employees SET Salary = 55000.00 WHERE EmployeeID = 1");

    // Удаление данных
    query.exec("DELETE FROM Employees WHERE EmployeeID = 1");

    // Закрытие подключения к базе данных
    db.close();

    return a.exec();
}

В файл pro добавляем: QT += sql

QT -= gui
QT += sql

CONFIG += c++11 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp

Разберемся с приведенным примером более подробно.

Подключение к базе данных:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase.db");

Здесь создается объект QSqlDatabase для подключения к базе данных SQLite. Устанавливается тип базы данных («QSQLITE») и имя базы данных («mydatabase.db»). Если базы данных с таким именем не существует, она будет создана.

Открытие подключения к базе данных:

if (!db.open()) {
    qDebug() << "Ошибка подключения к базе данных:" << db.lastError().text();
    return 1;
}

Производится попытка открытия подключения к базе данных. Если подключение не удалось, выводится сообщение об ошибке.

Создание таблицы:

QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS Employees ("
           "  EmployeeID INT PRIMARY KEY,"
           "  FirstName VARCHAR(50),"
           "  LastName VARCHAR(50),"
           "  Salary DECIMAL(10, 2)"
           ")");

Запрос выполняется для создания таблицы Employees с четырьмя столбцами: EmployeeID, FirstName, LastName и Salary.

Вставка данных:

query.exec("INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary) "
           "VALUES (1, 'John', 'Doe', 50000.00)");

Вставляется новая запись в таблицу Employees с указанными значениями.

Выбор данных:

query.exec("SELECT FirstName, LastName, Salary FROM Employees WHERE Salary > 50000");
while (query.next()) {
    QString firstName = query.value(0).toString();
    QString lastName = query.value(1).toString();
    double salary = query.value(2).toDouble();
    qDebug() << "Имя:" << firstName << "Фамилия:" << lastName << "Зарплата:" << salary;
}

Выполняется запрос для выбора данных о сотрудниках с зарплатой выше 50000. Результаты выводятся в консоль.

Обновление данных:

query.exec("UPDATE Employees SET Salary = 55000.00 WHERE EmployeeID = 1");

Обновляется зарплата сотрудника с EmployeeID равным 1.

Удаление данных:

query.exec("DELETE FROM Employees WHERE EmployeeID = 1");

Удаляется запись о сотруднике с EmployeeID равным 1.

Закрытие подключения к базе данных:

db.close();

После завершения работы с базой данных подключение закрывается.

Это основы работы с базой данных SQLite в приложении на C++ с использованием Qt. Каждая операция выполняется с использованием классов из модуля QtSql, что обеспечивает удобный способ взаимодействия с базой данных из приложения на Qt.