I'm currently working on a project and I'm quite new to Qt and SQLITE. I currently have an integer array and would like to use it to obtain data linked to the elements in the array. For example, if the data is 61616, it will output Sarah.
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);
I know this is wrong. Can someone explain how to properly do this?
Update:
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);
However, it still does not output to the table.
In this case the sentence you have to use is IN
:
SELECT name, memberType FROM members WHERE id IN (2, 4, 5, 6)
In this case we will use the string concatenation:
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);
Example:
#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();
}
Another solution:
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();