Qt sqlite 使用备忘

本文详细介绍了在Qt环境中使用SQLite数据库时的注意事项,包括如何创建数据库连接、多线程下的连接策略,以及QSqlTableModel在数据写入速度、增删改操作上的优化。特别强调了设置编辑策略为OnManualSubmit以避免长时间卡顿,以及在事务处理中使用QSqlDatabase::transaction(), submitAll() 和 commit() 的顺序以保证数据完整性。还提醒在插入、修改和删除操作中的一些关键细节,如设置PRIMARY KEY,对新插入行的赋值,以及在手动提交模式下删除行的处理方式。" 106014494,8212504,首席数据官CDO:数据转型的关键角色,"['数字化转型', 'CDO', '数据治理', '企业战略', '数据资产']
摘要由CSDN通过智能技术生成

一. 创建数据库连接

  1. 同一数据库,在一个线程中,如果创建多个连接,只有一个连接是打开的(虽然一般也不会这样干)
  2. QSqlDatabase类型的对象,只能在创建线程中使用。多线程 访问同一数据库需要创建不同连接(可以在连接名称中加入线程标识,用表记录下各个线程对应的连接,方便下次查询)。

二. QSqlTableModel(写入速度、增删改)

  • 写入速度问题:在操作过程中,如果QSqlTableModel类型对象,一次性进行插入大量数据到模板(或者提交大量修改到数据库),仅使用默认设置会出现长时间的卡顿现象,可通过以下设置进行改善:
  1. 将editStrategy设置为OnManualSubmit(手动提交修改)
  2. 插入数据时不要使用insertRow,而是同直接通过 insertRows() 批量插入数据
    a. 如果需要对插入的数据进行初始化动作,可以通过监控primeInsert()来实现,每次有新的行数据加入 的时候都会发出该信号
    b. insertRows添加的数据无法通过submit提交到数据库
  3. 应用修改到数据库时,各方法的调用顺序设置为:QSqlDatabase::transaction(),QSqlTableModel::submitAll(),QSqlDatabase::commit()。开启事务是为了让数据库的修改动作批量地执行,同时也可以保护数据库的完整性。
  • 关于修改:创建表时,需要设置PRIMARY KEY,否则会出现多行数据都被修改的情况
  • 关于插入:调用insertRow/insertRows插入行数据后,还需要对新插入的对象进行赋值操作,submit时,才会真正添加到数据库中
  • 关于删除:在OnManualSubmit模式下,删除新增并且未写入数据库的行数据,会立即执行,model中对应的行数据会被删除,可从图形界面(view)观察到。但是,若是删除数据库中已有的行数据,则仅删除命令写入到缓存,只有submitAll,数据库更新之后,才可从图形界面观察到。如果想要在第二种删除动作后,可立即在图形界面看到,但是又不想修改数据库,则除了调用QSqlTableModel本身的removeRow/removeRows外,还要自行处理model的数据(通过调用beginRemoveRows/
    endRemoveRows删除model中的行数据。并且要做好行号记录,以免与QSqlTableModel缓存中记录的操作有出入)
  • 信息补充
  1. SQLite Transaction

  2. SQLite Transaction中文

  3. QSqlTableModel Class

  4. 截取的Transaction部分介绍
    在这里插入图片描述

  5. 截取的insertRows , primeInsert 介绍在这里插入图片描述在这里插入图片描述

  6. QSqlTableModel::removeRows源码

/*!
    Removes \a count rows starting at \a row. Since this model
    does not support hierarchical structures, \a parent must be
    an invalid model index.

    When the edit strategy is OnManualSubmit, deletion of rows from
    the database is delayed until submitAll() is called.

    For OnFieldChange and OnRowChange, only one row may be deleted
    at a time and only if no other row has a cached change. Deletions
    are submitted immediately to the database. The model retains a
    blank row for successfully deleted row until refreshed with select().

    After failed deletion, the operation is not reverted in the model.
    The application may resubmit or revert.

    Inserted but not yet successfully submitted rows in the range to be
    removed are immediately removed from the model.

    Before a row is deleted from the database, the beforeDelete()
    signal is emitted.

    If row < 0 or row + count > rowCount(), no action is taken and
    false is returned. Returns \c true if all rows could be removed;
    otherwise returns \c false. Detailed database error information
    can be retrieved using lastError().

    \sa removeColumns(), insertRows()
*/
bool QSqlTableModel::removeRows(int row, int count, const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值