[QT编程系列-38]:数据存储 - SQLite数据库存储与操作

目录

1. SQLite数据库概述

1.1 简介

1.2 SQLite不支持网络连接

1.3 SQLite不需要安装MySQL Server数据库

1.4. SQLite性能

1.5 SQLite支持的数据条目

2. SQLite操作示例

3. QSqlDatabase 

4. QSqlQuery 


1. SQLite数据库概述

1.1 简介

QT 提供了对 SQLite 数据库的支持,通过 QT 的相关类和方法,可以方便地进行 SQLite 数据库的连接、查询和操作。

1.2 SQLite不支持网络连接

SQLite 是一种嵌入式数据库引擎,通常用于本地应用程序中,它被设计为本地文件数据库不直接提供网络连接功能。因此,SQLite 本身不支持直接通过网络连接到数据库。

然而,可以通过其他方法实现通过网络连接到 SQLite 数据库的功能。以下是一些常用的方法:

  1. 使用服务器中间件:可以在服务器和 SQLite 数据库之间使用服务器中间件来建立网络连接。这些中间件会充当客户端和数据库之间的桥梁,接收客户端请求并将其传递给 SQLite 数据库。常用的服务器中间件包括 SQLiteClien、sqlite-remotedatabase 和 SQL Relay。

  2. 使用网络协议:你可以通过实现自己的网络协议来连接到远程 SQLite 数据库。这可能涉及编写用于建立与远程服务器的连接并发送 SQL 查询的自定义网络代码。但需要注意的是,这种方法需要自行处理网络通信的复杂性和安全性。

  3. 使用其他数据库:如果你希望通过网络进行数据库访问,并且对于你的应用程序来说不一定要使用 SQLite,那么可以考虑使用其他支持网络连接的数据库,例如 MySQL、PostgreSQL、Microsoft SQL Server 等。这些数据库通常提供了内置的网络连接功能,可以更方便地通过网络连接进行数据库访问。

综上所述,虽然 SQLite 本身不直接支持通过网络连接,但可以通过使用服务器中间件、自定义网络协议或选择其他支持网络连接的数据库来实现通过网络连接到 SQLite 数据库的功能。选择适合你需求的方法,根据你的应用程序的具体要求进行操作。

1.3 SQLite不需要安装MySQL Server数据库

不需要单独安装 SQLite 数据库,因为 SQLite 是一个嵌入式数据库引擎。它以源代码或预编译库的形式提供,可以直接集成到应用程序中,无需单独安装

使用 SQLite 数据库非常方便,只需在你的应用程序中包含 SQLite 的相关文件或库,并在代码中使用相应的 API 即可。这样,你的应用程序就可以创建、连接和管理 SQLite 数据库,执行 SQL 查询和事务等操作。

SQLite 数据库通常以一个单一的文件形式存储在本地,也可以内存模式下进行操作。你可以手动创建数据库文件,也可以让 SQLite 自动创建。

因为 SQLite 是一个本地文件数据库,所以它的使用非常灵活和便捷。你可以将 SQLite 数据库文件随应用程序一起分发,让用户在本地使用。无需额外的数据库服务器,这使得 SQLite 成为在本地应用程序中轻量级的数据库解决方案。

总结来说,SQLite 是一个嵌入式数据库引擎,不需要单独安装。它可以直接集成到应用程序中,通过文件操作来创建、连接和管理数据库。这使得 SQLite 在开发本地应用程序时非常方便和便捷。

SQLite提供了一个简便的方式存储数据。

1.4. SQLite性能

QT 中的 SQLite 模块提供了与 SQLite 数据库进行交互的功能。

关于 QT SQLite 的性能,以下几个方面可能会影响其性能表现:

  1. 数据库访问模式:QT SQLite 模块支持多种不同的数据库访问模式,如默认模式(文件模式)、内存模式和只读模式等。性能可能会因所选的访问模式不同而有所不同。内存模式通常是最快的,因为它避免了硬盘读写操作。

  2. SQL 查询优化:编写高效的 SQL 查询是提高 QT SQLite 性能的关键。使用索引、适当的过滤条件和合适的查询方式,能够减少数据扫描,提高查询效率。

  3. 数据库连接池:使用连接池可以重用数据库连接,减少连接和断开连接的开销,提高性能。

  4. 事务处理:在批量插入、更新和删除等操作时,使用事务可以提高性能。事务可以将多个操作打包成一个原子性的操作,减少提交和回滚的次数,提高效率。

  5. 数据库设计和表结构:合理设计数据库和表结构,选择合适的数据类型和索引,能够优化查询和数据操作的性能。

  6. 硬件和环境:性能还受硬件和环境因素的影响,如硬盘速度、内存大小和 CPU 性能等。

需要根据具体的应用场景和需求来评估 QT SQLite 的性能,进行性能测试和优化。通常情况下,QT SQLite 在典型的轻量级数据库操作和中小规模数据应用中表现良好,并具有较高的性能和响应能力。但对于大规模数据处理和高并发访问,可能需要进一步评估性能,并考虑其他数据库解决方案。

1.5 SQLite支持的数据条目

SQLite 是一个轻量级的数据库引擎,无论是在理论上还是在实际应用中,SQLite 没有硬性的限制。然而,根据 SQLite 文档的说明,以下是一些关于数据条目(记录)的限制和建议:

  1. 数据库文件大小限制:SQLite 数据库文件的大小最多可以达到数 TB(1 TB = 1024 GB),这是因为 SQLite 使用 64 位整数来表示文件偏移量。

  2. 表中数据条目数量限制(行数据):SQLite 没有显示规定表中数据条目数量的上限。你可以在一张表中插入数百万、甚至上亿条数据。然而,数据库的性能和查询速度可能会受到影响,特别是在大规模数据处理和复杂查询的情况下。在这种情况下,你可能需要考虑优化表结构、索引和查询方式。

  3. 列数量限制(列数据):SQLite 没有固定的列数量限制。你可以在表中定义任意多的列。然而,每个表中的列数量会影响插入、查询和索引的性能。在设计表结构时,应根据数据模型的需要,合理选择列的数量,同时注意表的规范化和冗余问题。

  4. 行大小限制:SQLite 本身没有固定的行大小限制。但是,SQLite 数据库引擎的默认配置下,每个数据库文件的每个页的大小为 4096 字节。因此,在一个页内,存储的行数据大小总和不能超过该限制,否则会发生溢出。如果需要存储大型数据,如大文本或二进制数据,可以使用 BLOB 类型和流式方式处理。

总体而言,SQLite 在处理适度规模的数据时表现良好并无明显限制。针对大规模数据和高并发访问场景可能需要考虑其他数据库解决方案。在设计数据库结构和进行数据操作时,合理规划和优化是保证性能的关键。

2. SQLite操作示例

以下是一个示例,展示如何在 QT 中使用 SQLite 数据库:

  1. 首先,在 QT 项目中添加 QT += sql 到项目文件(.pro)中,以启用 QT 的数据库功能。

  2. 在需要使用 SQLite 数据库的地方,包括头文件  并使用相应的 QT 命名空间。

#include 
  1. 在代码中建立数据库连接,打开数据库文件,并创建一个查询对象
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("path/to/database.db");
if (db.open()) {
    QSqlQuery query;
    // 执行数据库操作
    // ...
}

在这个示例中,我们使用 QSqlDatabase 类创建一个 SQLite 数据库连接,并指定数据库文件的路径。然后,通过调用 db.open() 打开数据库连接,如果成功打开,则创建一个 QSqlQuery 查询对象,用于执行数据库操作。

  1. 在查询对象上执行数据库操作,例如插入、更新或查询数据。
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");

QString name = "John";
int age = 30;
query.prepare("INSERT INTO users (name, age) VALUES (?, ?)");
query.addBindValue(name);
query.addBindValue(age);
query.exec();

if (query.exec("SELECT * FROM users")) {
    while (query.next()) {
        int id = query.value("id").toInt();
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        // 处理查询结果
        // ...
    }
}

在这个示例中,我们使用 QSqlQuery 对象执行了一些数据库操作。首先,我们创建了一个名为 “users” 的数据表(如果不存在),然后插入了一条数据。接下来,我们执行了一个查询语句 "SELECT * FROM users" 来获取数据表中的内容,然后遍历查询结果并处理每一行的数据。

  1. 最后,在完成数据库操作后,记得关闭数据库连接。
db.close();

通过调用 db.close() 可以关闭 SQLite 数据库连接。

通过上述步骤,你可以在 QT 中使用 SQLite 数据库进行各种数据库操作,包括创建表、插入数据、更新数据和查询数据等。你可以根据具体的需求和业务逻辑进行相应的操作。

3. QSqlDatabase 

QSqlDatabase 类是 QT 中用于管理数据库连接的类

它提供了一种统一的接口来连接和操作不同类型的数据库,包括 SQLite、MySQL、PostgreSQL 等。

下面列出了一些常用的 QSqlDatabase 类的方法和功能:

  1. QSqlDatabase::addDatabase(const QString &driverName):添加一个数据库连接,并指定驱动类型。驱动类型可以是 “QSQLITE”、“QMYSQL”、“QPSQL” 等。返回一个数据库连接对象。

  2. QSqlDatabase::setDatabaseName(const QString &name):设置数据库名称或文件路径。

  3. QSqlDatabase::setHostName(const QString &host):设置数据库服务器的主机名。

  4. QSqlDatabase::setUserName(const QString &userName):设置连接数据库的用户名。

  5. QSqlDatabase::setPassword(const QString &password):设置连接数据库的密码。

  6. QSqlDatabase::open():打开数据库连接。

  7. QSqlDatabase::isOpen():检查数据库连接是否已打开。

  8. QSqlDatabase::close():关闭数据库连接。

  9. QSqlDatabase::database():获取当前默认数据库连接。

  10. QSqlDatabase::tables():获取数据库中所有的表。

  11. QSqlDatabase::drivers():获取 QT 支持的所有数据库驱动列表。

通过 QSqlDatabase 类,你可以创建、打开、关闭和管理数据库连接。你可以使用相关的方法来设置连接的属性,例如数据库名称、用户名、密码等。一旦连接成功,你可以执行 SQL 查询、插入、更新等操作。

以下是一个示例代码,展示了如何使用 QSqlDatabase 类连接到 SQLite 数据库:

#include 

QString dbName = "path/to/database.db";
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(dbName);

if (db.open()) {
    // 数据库连接成功
    // 执行数据库操作
} else {
    // 数据库连接失败
    QString errorMessage = db.lastError().text();
    // 处理连接错误
}

在上述示例中,首先调用 QSqlDatabase::addDatabase("QSQLITE") 创建一个 SQLite 数据库连接。然后,使用 setDatabaseName() 方法设置数据库文件路径。最后,通过 db.open() 方法打开数据库连接。如果连接成功,可以执行相应的数据库操作。如果连接失败,可以通过 db.lastError() 获取错误信息并进行相应的处理。

总结来说,QSqlDatabase 类提供了管理数据库连接的功能,包括连接的创建、打开、关闭以及设置连接属性等。使用这个类,你可以方便地在 QT 应用程序中连接和操作不同类型的数据库。

4. QSqlQuery 

QSqlQuery 类是 QT 中用于执行和处理 SQL 查询的类。它提供了一种简单的方式来执行查询、插入、更新和删除等数据库操作,并处理查询结果。

以下是一些常用的 QSqlQuery 类的方法和功能:

  1. QSqlQuery::exec(const QString &query):执行 SQL 查询或操作。可以传递一个完整的 SQL 语句作为参数,用于执行查询和修改操作(如插入、更新或删除)。返回一个布尔值,表示查询是否执行成功。

  2. QSqlQuery::exec():执行提前设置的查询语句或操作。在调用 prepare() 方法后,可以调用该方法来执行语句。

  3. QSqlQuery::prepare(const QString &query):准备查询语句,但不执行它。可以使用 ? 占位符来代替查询语句中的参数,然后使用 addBindValue() 方法将参数绑定到查询中。

  4. QSqlQuery::next():在执行查询后,移动到下一条记录。可以在循环中使用,以遍历查询结果。

  5. QSqlQuery::value(int index)QSqlQuery::value(const QString &name):获取当前记录中指定列的值。可以通过索引或列名访问数据。

  6. QSqlQuery::bindValue(const QString &placeholder, const QVariant &value):将值绑定到预处理查询中的占位符。

  7. QSqlQuery::lastInsertId():在执行插入语句后,返回最后插入的行的 ID。

  8. QSqlQuery::isActive()QSqlQuery::isValid():检查查询是否处于活动状态,以及查询结果是否有效。

以下是一个示例代码,展示了如何使用 QSqlQuery 类执行 SQL 查询和处理查询结果:

QString queryStr = "SELECT * FROM users";
QSqlQuery query(queryStr);

if (query.exec()) {
    // 查询执行成功
    while (query.next()) {
        QString name = query.value("name").toString();
        int age = query.value("age").toInt();
        // 处理查询结果
    }
} else {
    // 查询执行失败
    QString errorMessage = query.lastError().text();
    // 处理查询错误
}

在上述示例中,我们创建了一个 QSqlQuery 对象,并使用 exec() 方法执行了一个查询语句。然后,使用 next() 和 value() 方法遍历查询结果,并获取每一行记录的值。

需要注意的是,QSqlQuery 是一个基于结果集的类,它仅处理查询的结果,而不会直接执行修改数据库的操作。对于插入、更新或删除操作,你可以使用 exec() 方法或提前准备好的查询语句进行执行。

总结来说,QSqlQuery 类允许你执行 SQL 查询并处理查询结果。你可以使用相关方法获取查询结果中的值,并执行插入、更新和删除等操作。通过使用 QSqlQuery 来构建和执行 SQL 查询,你可以轻松地与数据库进行交互,并获取和操作所需的数据。

你可能感兴趣的:(编程系列-QT,数据库,qt,sqlite)