Qt и SQLite: фильтр с использованием элементов массива

В настоящее время я работаю над проектом, и я довольно плохо знаком с Qt и SQLITE. В настоящее время у меня есть целочисленный массив, и я хотел бы использовать его для получения данных, связанных с элементами в массиве. Например, если данные 61616, они выведут Сару.

query.prepare("SELECT name,memberType FROM members WHERE id = :id");
for(index = 0; index < dateIndex; index++)
{
    id = idAr[index];
    query.addBindValue(id);
    query.exec();
}

model2->setQuery(query);
ui->tableView_10->setModel(model2);

Я знаю, что это неправильно. Может кто-нибудь объяснить, как правильно это сделать?

Обновить:

std::vector<int> idA={3, 7, 15, 16, 19, 30};
QSqlQuery qry(QString("SELECT name, memberType FROM members WHERE id IN (?%1)")
                .arg(QString(", ?").repeated(idA.size()-1)));
for(int i = 0; i < idA.size(); i++)
{
    int id2 = idA[i];
    qry.addBindValue(id2);
}
qry.exec();
model2->setQuery(qry);
ui->tableView_10->setModel(model2);

Тем не менее, он все еще не выводится в таблицу.

1 ответ

Решение

В этом случае предложение, которое вы должны использовать, IN:

SELECT name, memberType FROM members WHERE id IN (2, 4, 5, 6)

В этом случае мы будем использовать конкатенацию строк:

std::vector<int> idA = {3, 7, 15, 16, 19, 30};

QStringList ids_string;
for(const int & val : idA) 
    ids_string << QString::number(val);

QSqlQuery query(QString("SELECT name, memberType FROM members WHERE id IN (%1)")
                .arg(ids_string.join(",")));
model.setQuery(query);

Пример:

#include <QApplication>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QTableView>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        qDebug()<<"Unable to establish a database connection";
        return false;
    }
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS members (id INTEGER PRIMARY KEY AUTOINCREMENT, "
               "name VARCHAR(20), memberType VARCHAR(20))");
    for(int i=1; i<40; i++)
        query.exec(QString("insert into members(name, memberType) values('name%1', 'memberType%2')").arg(i).arg(i));
    return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createConnection())
        return -1;

    QTableView w;
    QSqlQueryModel model;
    std::vector<int> ids = {3, 7, 15, 16, 19, 30};
    QStringList ids_string;
    for(const int & val : ids) ids_string<<QString::number(val);
    QSqlQuery query(QString("SELECT name, memberType FROM members WHERE id IN (%1)")
                    .arg(ids_string.join(",")));
    model.setQuery(query);
    w.setModel(&model);
    w.show();
    return a.exec();
}

Другое решение:

int std::vector<int> idAr={3, 7, 15, 16, 19, 30};
int dateIndex = 6;
QSqlQuery query(QString("SELECT name, memberType FROM members WHERE id IN (?%1)")
                .arg(QString(", ?").repeated(idAr.size()-1)));
for(const int & id: idAr)
    query.addBindValue(id);
query.exec();
Другие вопросы по тегам