我有以下问题:
我尝试执行两个嵌套查询但在执行secon查询后,第一个查询的结果被删除或者其他。
实施例: 我在items表中有两个项目,在lendings表中有两个条目。 第一个查询将结果保存这两个项目,但在执行基于第一个项目的第二个查询后,sqlQuery.next()方法不再提供第二个项目。
我希望这是可以理解的,对不起!
这是从sqlite数据库加载项目的方法:
ItemsList *DatabaseManager::getAllItems() {
this->db.open();
ItemsList* fetchedItems = new ItemsList();
QSqlQuery sqlQuery;
if (sqlQuery.exec("SELECT * FROM items ORDER BY name COLLATE NOCASE")) {
while (sqlQuery.next()) {
Item* fetchedItem = new Item();
fetchedItem->setItemId(sqlQuery.value(0).toInt());
fetchedItem->setName(sqlQuery.value(1).toString());
addLendingsToItem(fetchedItem);
ItemNode* fetchedItemNode = new ItemNode(fetchedItem);
fetchedItems->add(fetchedItemNode);
}
} else {
qDebug() << sqlQuery.lastQuery();
qDebug() << sqlQuery.lastError().text();
}
if (this->db.isOpen()) {
this->db.close();
}
return fetchedItems; }
这是保存第二个查询的方法:
void DatabaseManager::addLendingsToItem(Item* fetchedItem) {
QSqlQuery sqlQuery;
sqlQuery.prepare("SELECT i.itemId, i.name, l.lent, l.personId FROM items i JOIN lendings l ON i.itemId = l.itemId WHERE i.itemId = :itemId"); sqlQuery.bindValue(":itemId", fetchedItem->getItemId());
sqlQuery.bindValue(":itemId", fetchedItem->getItemId());
if (sqlQuery.exec()) {
while (sqlQuery.next()) {
if (sqlQuery.value(2).toInt() == 1) {
fetchedItem->setPerson(getPerson(sqlQuery.value(3).toInt()));
fetchedItem->setIsLent(true);
} else {
fetchedItem->getLentByList()->add(new PersonNode(getPerson(sqlQuery.value(3).toInt())));
}
}
} else {
qDebug() << sqlQuery.lastQuery();
qDebug() << sqlQuery.lastError().text();
} }