0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术Linux主板Qt数据库应用程序简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-17 09:44 次阅读

SQLite是一个开源的嵌入式数据库,其特点是零配置,可移植性好,小巧、高效而且可靠。同时SQLite的数据库权限只依赖于文件系统,没有用户帐户的概念,因此使用起来很方便。英创Linux主板能够很好的支持SQLite,相关的测试例程已经在光盘中提供,本文主要简介Qt中的数据库开发。

Qt中的QtSql模块提供了对数据库的支持,该模块中的众多类基本上可以分为三层:用户接口层、SQL接口层,驱动层。

其中驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁;SQL接口层提供了对数据库的访问;用户接口层的几个类实现了将数据库中的数据链接到窗口部件上,这些类是使用前一章的模型/视图框架实现的,它们是更高层次的抽象,即便不熟悉SQL也可以操作数据库。如果要使用QtQql模块中的这些类,需要在项目文件(.pro文件)中添加QT += sql这一行代码。

QtSql模块使用数据库驱动来和不同的数据库接口进行通信。由于Qt的SQL模型的接口是独立于数据库的,所以所有数据库特定的代码都包含在了这些驱动中。我们使用的免费的Qt只提供了SQLite和ODBC数据库的驱动。创建数据库连接:

QSqlDatabase db = QSqlDatabase::addDatabase('QSQLITE'); //指定驱动
db.setDatabaseName('/mnt/nandflash/my.db'); //指定路径

使用open()函数将数据库打开,如果打开失败,则弹出对话提示框:
if (!db.open())
{
QMessageBox::critical(0, qApp->tr('Cannot open database'),
qApp->tr('Unable to establisha database connection.'
), QMessageBox::Cancel);
return false;
}

使用QSqlQuery创建了一个product表,并插入id,name和speed三个字段的三条记录。其中,id字段是int类型的,''primary key ''表明该字段是主键,它不能为空,而且不能有重复的值;而name字段是varchar类型的,Speed字段也是varchar类型的,注意这里使用的SQL语句都要包含在双引号中,如果一行写不完,那么分行后,每一行都要使用两个双引号引起来:

QSqlQuery query;
// 创建product表
query.exec(QString ('create table product (id int primary key, '
'name varchar, Speed varchar)'));
query.exec(QString ('insert into product values(1, 'EM335x', '1GHZ')'));
query.exec(QString ('insert into product values(2, 'EM3352', '600MHZ')'));
query.exec(QString ('insert intoproduct values(3, 'EM9280', '454MHZ')'));

SQL表格模型提供了一个一次只能操作一个SQL表的读/写模型QSqlTableModel,它可以浏览和修改独立的SQL表,并且只需编写很少的代码,而且不需要了解SQL语法。该模型默认是可读可写的。我们首先创建一个QSqlTableModel,只须使用setTable()来为其指定数据库表,然后使用select()函数进行查询:

model = new QSqlTableModel(this);
model->setTable('product');
model->select();
// 设置编辑策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);

在使用该模型前,一般还要设置其编辑策略,它由QsqlTableModel::EditStrategy枚举变量定义,一共有三个值:
QsqlTableModel::OnFieldChange:所有对模型的改变都会立即应用到数据库。
QsqlTableModel::OnRowChange:对一条记录的改变会在用户选择另一条记录时被应用。
QsqlTableModel::OnManualSubmit:所有的改变都会在模型中进行缓存,知道调用submitAll()或者revertAll()函数。

下面添加一些功能按钮,逐个实现他们:

// 提交修改按钮
void MainWindow::on_pushButton_clicked()
{
// 开始事务操作
model->database().transaction();
if (model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr('tableModel'),
tr('数据库错误: %1').arg(model->lastError().text()));
}
}

如果可以使用submitAll()将模型中的修改向数据库提交成功,那么执行commit(),否则进行回滚rollback(),并提示错误信息,下面是撤销修改按钮:

// 撤销修改按钮
void MainWindow::on_pushButton_2_clicked()
{
model->revertAll();
}

这里使用了setFilter()函数来进行数据筛选,采用id来筛选:

// 查询按钮,进行筛选
void MainWindow::on_pushButton_7_clicked()
{
QString id = ui->comboBox->currentText();
//根据id进行筛选,一定要使用单引号
model->setFilter(QString('id = '%1'').arg(id));
model->select();
}

使用setTable()来指定数据库表,然后使用select()函数进行查询:
// 显示全表按钮
void MainWindow::on_pushButton_8_clicked()
{
model->setTable('product');
model->select();
}

// 按id升序排列按钮
void MainWindow::on_pushButton_5_clicked()
{
//id属性,即第0列,升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
}

// 按id降序排列按钮
void MainWindow::on_pushButton_6_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}

// 删除选中行按钮
void MainWindow::on_pushButton_4_clicked()
{
// 获取选中的行
int curRow = ui->tableView->currentIndex().row();
// 删除该行
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr('删除当前行!'),
tr('你确定删除当前行吗?'), QMessageBox::No,QMessageBox::Yes);
if(ok == QMessageBox::No)
{ // 如果不删除,则撤销
model->revertAll();
} else { // 否则提交,在数据库中删除该行
model->submitAll();
}
}

// 添加记录按钮
void MainWindow::on_pushButton_3_clicked()
{
// 获得表的行数
int rowNum = model->rowCount();
int id = rowNum + 1 ;
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0), id);
// 可以直接提交
//model->submitAll();
}

运行效果:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11354

    浏览量

    210657
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6087

    浏览量

    35672
收藏 人收藏

    评论

    相关推荐

    适用于SQLite的dbExpress数据库驱动程序

    Builder(包括社区版)对 SQLite 的快速访问,在 Windows 和 macOS(32 位和 64 位)和 Linux(64 位)平台。 对于此数据库引擎,dbExpress 提供了一个
    的头像 发表于 02-09 09:45 107次阅读

    从Delphi、C++ Builder和Lazarus连接到MySQL数据库

    平台。 基于 MyDAC 的应用程序可以直接连接到 MySQL 服务器或通过 MySQL 客户端工作。MySQL 数据访问组件旨在帮助程序员更快、更轻松地开发 MySQL
    的头像 发表于 01-20 13:47 158次阅读
    从Delphi、C++ Builder和Lazarus连接到MySQL<b class='flag-5'>数据库</b>

    适用于MySQL和MariaDB的Python连接器:可靠的MySQL数据连接器和数据库

    Linux 的 wheel 包分发。 直接连接 该解决方案使您能够通过 TCP/IP 建立与 MySQL 或者 MariaDB 数据库服务器的直接连接,而无需数据库客户端。另外
    的头像 发表于 01-17 12:18 150次阅读
    适用于MySQL和MariaDB的Python连接器:可靠的MySQL<b class='flag-5'>数据</b>连接器和<b class='flag-5'>数据库</b>

    从Delphi、C++ Builder和Lazarus连接到Oracle数据库

    帮助程序员开发更快、更原生的 Oracle 数据库应用程序。 ODAC 是一种高性能且功能丰富的 Oracle 连接解决方案,是 Borland 数据库引擎 (BDE) 和标准 dbE
    的头像 发表于 01-15 10:01 192次阅读

    基于QT开发国产主板终端桌面程序 高效、稳定、跨平台的解决方案

    了开发者们面临的一个重要挑战。本文将介绍如何基于QT框架,开发适用于国产主板的终端桌面程序,并探讨其优势和应用场景。 QT是一个跨平台的C++图形用户界面
    的头像 发表于 01-08 15:34 229次阅读

    数据库是哪种数据库类型?

    数据库是一种部署在虚拟计算环境中的数据库,它融合了云计算的弹性和可扩展性,为用户提供高效、灵活的数据库服务。云数据库主要分为两大类:关系型数据库
    的头像 发表于 01-07 10:22 161次阅读

    数据库数据恢复—Mysql数据库表记录丢失的数据恢复流程

    Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分
    的头像 发表于 12-16 11:05 243次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—Mysql<b class='flag-5'>数据库</b>表记录丢失的<b class='flag-5'>数据</b>恢复流程

    数据库数据恢复—通过拼接数据库碎片恢复SQLserver数据库

    一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库
    的头像 发表于 10-31 13:21 349次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—通过拼接<b class='flag-5'>数据库</b>碎片恢复SQLserver<b class='flag-5'>数据库</b>

    有云服务器还需要租用数据库吗?

    如果你的应用程序需要处理大量的数据,并且这些数据需要高效的查询和分析能力,那么租用专业的数据库服务可能是更好的选择。这些服务通常提供了更高的性能、更好的可扩展性和更强的
    的头像 发表于 10-31 10:50 151次阅读

    数据库数据恢复—SQL Server数据库出现823错误的数据恢复案例

    SQL Server数据库故障: SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库
    的头像 发表于 09-20 11:46 423次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—SQL Server<b class='flag-5'>数据库</b>出现823错误的<b class='flag-5'>数据</b>恢复案例

    基于WDS证券行业建设金融信云承载数据库类关键应用

    基于WDS证券行业建设金融信云承载数据库类关键应用
    的头像 发表于 09-03 10:07 308次阅读
    基于WDS证券行业建设金融信<b class='flag-5'>创</b>云承载<b class='flag-5'>数据库</b>类关键应用

    自研创新 数智未来 2024中国数据库技术大会盛大召开

    浪潮汹涌澎湃,数据库作为信息技术的核心基础设施,正以前所未用的速度推动各行各业的智能化升级。大会以“自研创新 数智未来”为主题,设置2大主会场,20+技术专场,重点围绕向量数据库与向量
    的头像 发表于 08-27 18:07 687次阅读
    自研创新 数智未来 2024中国<b class='flag-5'>数据库</b><b class='flag-5'>技术</b>大会盛大召开

    基于分布式存储WDS的金融信云承载数据库类关键应用

    基于分布式存储WDS的金融信云承载数据库类关键应用
    的头像 发表于 08-16 09:42 343次阅读
    基于分布式存储WDS的金融信<b class='flag-5'>创</b>云承载<b class='flag-5'>数据库</b>类关键应用

    数据仓库与数据库的主要区别

    数据仓库与数据库是两个在信息技术领域中常见的概念,它们在数据管理和分析方面发挥着重要作用。尽管它们在某些方面有相似之处,但它们在设计、目的和功能上存在显著差异。本文将介绍
    的头像 发表于 07-05 14:57 608次阅读

    在嵌入式系统中集成Rust和Qt的实践

    Rust 拥有丰富的生态系统,用于序列化和反序列化、异步操作、解析不安全输入、线程、静态分析等,而 Qt 是一个 C++ 工具包,支持跨各种平台的丰富的、基于 GUI 的应用程序,从 iOS 到嵌入式
    发表于 05-03 10:26 1932次阅读
    在嵌入式系统中集成Rust和<b class='flag-5'>Qt</b>的实践