一. 创建数据库连接

  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 modeldoes not support hierarchical structures, \a parent must bean invalid model index.When the edit strategy is OnManualSubmit, deletion of rows fromthe database is delayed until submitAll() is called.For OnFieldChange and OnRowChange, only one row may be deletedat a time and only if no other row has a cached change. Deletionsare submitted immediately to the database. The model retains ablank 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 beremoved 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 andfalse is returned. Returns \c true if all rows could be removed;otherwise returns \c false. Detailed database error informationcan be retrieved using lastError().\sa removeColumns(), insertRows()
*/
bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent)
{Q_D(QSqlTableModel);if (parent.isValid() || row < 0 || count <= 0)return false;else if (row + count > rowCount())return false;else if (!count)return true;if (d->strategy != OnManualSubmit)if (count > 1 || (d->cache.value(row).submitted() && isDirty()))return false;// Iterate backwards so we don't have to worry about removed rows causing// higher cache entries to shift downwards.for (int idx = row + count - 1; idx >= row; --idx) {QSqlTableModelPrivate::ModifiedRow& mrow = d->cache[idx];if (mrow.op() == QSqlTableModelPrivate::Insert) {revertRow(idx);//!!!!!!删除新增并且未写入数据库的行数据,直接回滚,并发出beginRemoveRows信号} else {//!!!!!!!!!删除数据库中已有的行数据,则仅将删除命令写入到缓存,不执行model数据的删除动作if (mrow.op() == QSqlTableModelPrivate::None)mrow = QSqlTableModelPrivate::ModifiedRow(QSqlTableModelPrivate::Delete,QSqlQueryModel::record(idx));elsemrow.setOp(QSqlTableModelPrivate::Delete);if (d->strategy == OnManualSubmit)emit headerDataChanged(Qt::Vertical, idx, idx);}}if (d->strategy != OnManualSubmit)return submit();return true;
}void QSqlTableModelPrivate::revertCachedRow(int row)
{Q_Q(QSqlTableModel);ModifiedRow r = cache.value(row);switch (r.op()) {case QSqlTableModelPrivate::None:Q_ASSERT_X(false, "QSqlTableModelPrivate::revertCachedRow()", "Invalid entry in cache map");return;case QSqlTableModelPrivate::Update:case QSqlTableModelPrivate::Delete:if (!r.submitted()) {cache[row].revert();emit q->dataChanged(q->createIndex(row, 0),q->createIndex(row, q->columnCount() - 1));}break;case QSqlTableModelPrivate::Insert: {QMap<int, QSqlTableModelPrivate::ModifiedRow>::Iterator it = cache.find(row);if (it == cache.end())return;q->beginRemoveRows(QModelIndex(), row, row);it = cache.erase(it);while (it != cache.end()) {int oldKey = it.key();const QSqlTableModelPrivate::ModifiedRow oldValue = it.value();cache.erase(it);it = cache.insert(oldKey - 1, oldValue);++it;}q->endRemoveRows();break; }}
}

Qt sqlite 使用备忘相关推荐

  1. 隐马尔可夫模型HMM学习备忘

    隐马尔可夫模型HMM学习备忘 目录 隐马尔可夫模型HMM学习备忘 1.马尔可夫模型的理解 2.隐马尔可夫模型 2.1.HHM的组成 2.2.HMM解决的三个基本问题 隐马尔可夫模型示意图如图[1]: ...

  2. element ui字段_ui备忘单下拉字段

    element ui字段 重点 (Top highlight) Dropdowns get a lot of flak from the UI world – and if we are honest ...

  3. android swstnw cn,Android应用开发之ubuntu14.04编译ijkplayer备忘

    本文将带你了解Android应用开发之ubuntu14.04编译ijkplayer备忘,希望本文对大家学Android有所帮助 1.   i|VIhzkKCf#3UUnstall gi[e-RkYJ4 ...

  4. Android实验之实现一个生日备忘簿

    一.实验内容 实现一个生日备忘簿 二.实验目的 1. 学习 SQLite 数据库的使用; 2. 学习ContentProvider的使用; 3. 复习Android界面编程. 三.实验要求 1. 使用 ...

  5. vim的一些快捷键,备忘

    vim的一些快捷键,备忘 快捷键                                            作用 ctrl+g                                ...

  6. 资源 | AI、神经网络、机器学习、深度学习以及大数据学习备忘单

    向AI转型的程序员都关注了这个号☝☝☝ 以下是关于神经网络.机器学习.深度学习以及大数据学习的备忘单,其中部分内容和此前发布的<资源 | 值得收藏的 27 个机器学习的小抄>有所重复,大家 ...

  7. 机器学习项目的备忘清单!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Harshit Tyagi,编译:机器之心 机器学习项目中含有众多 ...

  8. 备忘:C语言void *

    由于研究一段代码的时候,看到了 void *.故此进行了学习. 看了 http://www.doc88.com/p-894907672962.html  的说明,感觉写得太好了,已无话可说. 故此备忘 ...

  9. [译] Kotlin 标准方法备忘

    原文地址:Kotlin Standard Functions cheat-sheet 原文作者:Jose Alcérreca 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/go ...

最新文章

  1. 机器学习特征筛选:互信息法(mutual information)
  2. 我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!
  3. 看到一个词语提取小工具,分享给有标签、词库需求的同学们
  4. 交通与计算机杂志社,交通信息与安全
  5. 更改自身web项目的图标(默认为tomcat的小喵咪)
  6. BlockingQueue的核心方法
  7. 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
  8. 数字电路课程设计汽车尾灯控制器
  9. [免费]寻觅程序运行名字
  10. malloc失败的一个原因
  11. 京东淘宝,拼多多三大电商平台竞品分析
  12. 计算机音乐数字乐谱生僻字,《生僻字》歌曲简谱
  13. 计算机word设置渐变填充,在word2013中设置渐变填充效果的详细设置步骤
  14. Redis Sentinel配置
  15. Android 调节屏幕亮度(当前应用和系统亮度)
  16. 90后男生全款4万买房移居鹤岗
  17. 入职Facebook四年了!
  18. css网页技术的网页交互方法
  19. 攻防世界web新手- fileinclude宜州网信办
  20. 模态分析-约束模态分析03

热门文章

  1. 无人自动驾驶使用的激光雷达标定板
  2. 一个循环实现冒泡法排序(并没有什么卵用)
  3. Mac上微信、QQ的聊天图片和记录保存在哪?如何清理或导出?
  4. Shell基础(二)
  5. 一个统计类型的小程序应用
  6. 说说SEO论坛百度快速排名优化,网站被K了怎么办,最好的SEO视频教程
  7. Sparrow——基础搭建
  8. MVP??你配吗??
  9. python中特别注意除号'/'和‘//’的区别
  10. 安装ecplise的详细过程