sqlite 如何获取QSqlTableModel中记录的行?

1tu0hz3e  于 2023-01-17  发布在  SQLite
关注(0)|答案(2)|浏览(256)

我是qt的新手,我没有找到一种方法来检索某个元素的行,我只知道一个字段值(例如email)。
我有一个模型(QSqlTableModel),我想知道表“person”中的记录的行是什么,电子邮件是“a@gmail.com“。QSqlQuery不返回行,我如何实现这一点?

QSqlQuery query;
query.exec(QString("SELECT * FROM person WHERE email = \"%1\";").arg("a@gmail.com"));
// the query.exec do not return rows, but I need to know it, in order to edit some (not selectable) item, using QSqlTableModel::setRecord(int row, ...) for example.
cunj1qz1

cunj1qz11#

可采用不同的方法:

  • 扫描并测试整个表上的数据,如下所示:
int getFirstRowWithEmail(
      QSqlTableModel& table, 
      const QString & email)
{
   int col = table.fieldIndex("email");
   for(int row=0; row<table; ++row)
   {
      QVariant data = table.data(table.index(row,col));
      if(data.toString() == email) 
      {
         return row;
      }
   }

   return -1;
}
  • 通过QSortFilterProxyModel过滤您的数据字符串:
int getFirstRowWithEmail(
        QSqlTableModel& table, 
        const QString & email)
{
   int col = table.fieldIndex("email");
   QSortFilterProxyModel proxy;
   proxy.setSourceModel(table);
   proxy.setFilterKeyColumn(col);
   proxy.setFilterRegExp(QString("^%1$").arg(email));
   if( proxy.rowcount() > 0) 
   {
       auto proxyIndex = proxyModel->index(0,0);
       auto sourceIndex = proxyModel->mapToSource( proxyIndex );
       return sourceIndex.row();
   }

   return -1;
}

注意,我们假设该字段是唯一的,否则将需要返回如下的ID列表。

std::list<int> getRowsWithEmail(
           QSqlTableModel& table, 
           const QString & email)
  {
     std::list<int> rows;
     int col = table.fieldIndex("email");
     for(int row=0; row<table; ++row)
     {
        QVariant data = table.data(
                           table.index(row,col));
        if(data.toString() == email) 
        {
           rows.append(row);
        }
     }

     return rows;
  }
6uxekuva

6uxekuva2#

从医生那里。
QSqlQuery一次提供一条记录的结果集访问。调用exec()后,QSqlQuery的内部指针位于第一条记录之前的一个位置。我们必须调用一次QSqlQuery::next()以前进到第一条记录,然后再次重复调用next()以访问其他记录,直到它返回false。下面是一个按顺序迭代所有记录的典型循环:

while (query.next()) {
    QString name = query.value(0).toString();
    int salary = query.value(1).toInt();
    qDebug() << name << salary;
}

注意,QSqlQuery::value接受一个字段索引。字段使用SELECT语句的文本从左到右编号。
在您的示例中,字段将按照创建时的顺序排序,因为您使用SELECT *返回一行的所有元素。

相关问题