QSqlTabelModel绑定SQLite关键字进行倒序分页查找
一、QT绑定SQLite关键字进行倒序分页查询
qt绑定SQLite就不用在多介绍使用了,直接展示核心代码进行SQLite的带条件倒叙分页查询
下面展示
// 这里我们根据StartTime 字段进行筛选,
//筛选后进行倒叙分组然后显示从第0条到第24条
QString SqlSelect = "SELECT * FROM HisAlarm WHERE StartTime BETWEEN '"
+"2020/09/07 12:00"+"' AND '"+"2020/09/12 12:00"+"'"
+QString(" order by Time desc limit %1,%2 ").arg(QString::number(0)).arg(QString::number(24));
QSqlQuery query; //这里需要自己绑定数据库 我是为了展示语句
query->prepare(SqlSelect );
query->exec();
二、QSqlTabelModel绑定Sqlite进行倒叙分页查询
QT提供了QSqlTabelModel,这个类给我们提供了很大的便捷性。它的模式和普通的model一致,首先我们可以运用QSqlTabelModel来绑定Sqlite进行方便的分页查询代码如下
// ui->tw_HistoryAlarm是我的一个Tabelview,m_GlobalVar.db->getDatabase()是获取到我的数据库
m_HisAlarm_Model =new QSqlTabelModel(ui->tw_HistoryAlarm, m_GlobalVar.db->getDatabase());
m_HisAlarm_Model->setTable("HisAlarm"); //进行绑定sqlite表
//StartTime 是我表中一个字段 这里之间用这句话即可分页查询显示在tableview中
// 1 = 1应该相当于Where但是他不是Where应该是QSqlTabelModel自己的语法, limit 0 ,24 0代表第0页 24 代表显示24条数据 *****这里注意 0,24与之间绑定的SQLite语句不同这里是页数
QString filter = QString("1=1 order by StartTime desc limit %1,%2;")
.arg(QString::number(0)).arg(QString::number(24));
m_HisAlarm_Model->setFilter(filter);
//setFilter后一定要select
m_HisAlarm_Model->select();
这样看上去是不是还可以,我们继续往下,我们在使用中发现了QT提供自带的排序方法,我们对其进行实验操作使用QSqlTableModel::sort(int column, Qt::SortOrder order)方法
下面展示一些 内联代码片
。
// 和上面一样只需要绑定我们的表就可以直接排序 0代表第0列 根据第0列进行倒叙排列
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->setSort(0,Qt::DescendingOrder);
m_HisAlarm_Model->select();
这样看起来还是不错的,可是我们要怎么去进行分页呢?然后进行以下测试
下面展示一些 内联代码片
。
// 和上面一样只需要绑定我们的表就可以直接排序
//0代表第0列 根据第0列进行倒叙排列
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->setSort(0,Qt::DescendingOrder);
m_HisAlarm_Model->select();
但是怎么去进行分页呢,首先的想法是先排序在分页再select,尝试失败,再试先分页再排序,也是失败。下面是代码部分(错误的示例)(个人猜测可能因为model的排序和普通的分页语句是冲突的,排序应该使用的内部的东西) 大家有什么了解的也可以评论告诉我
下面展示一些 内联代码片
。
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->setSort(0,Qt::DescendingOrder);
QString filter = QString("1=1 order by StartTime desc limit %1,%2;")
.arg(QString::number(0)).arg(QString::number(24));
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->select();
//或者
m_HisAlarm_Model->setFilter(filter);
QString filter = QString("1=1 order by StartTime desc limit %1,%2;")
.arg(QString::number(0)).arg(QString::number(24));
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->select();
m_HisAlarm_Model->setSort(0,Qt::DescendingOrder);
m_HisAlarm_Model->select();
//都是失败的
哪我们要怎么去使用QSqlTableModel进行排序并且分页呢?我做了以下尝试最终得出可用方案
在这里首先有个很奇怪的东西,就是1=1 在上面分页的时候我们使用的1=1猜测为where, 但是在我们使用的时候发现这个1=1并不是where我进行了查找,没有找到他的含义,在我这认位它可能只是分页所必须的一个特殊字段。
下面展示一些 内联代码片
。
//这里不能使用where 或者 1=1 使用便无法查询出来,
//这句结果就是在时间段内找出倒序的第0条数据到第24条数据,
//进行分页时只需要将0,24进行累加即可
//如需要首页尾页的查询可以在下方给我留言可以再写一篇这个分页的具体实现
//还有就是' '单引号必须存在否则无法查询,
//可能这句话是比较简单,确实这个东西比较恶心需要注意的小点没有特殊的说明
QString filter= "StartTime BETWEEN '"
+"2020/09/07 12:00"+"' AND '"+"2020/09/12 12:00"+"'"
+QString(" order by Time desc limit %1,%2 ")
.arg(QString::number(0)).arg(QString::number(24));
m_HisAlarm_Model->setFilter(filter);
m_HisAlarm_Model->select();