Я получил следующий пример кода.
Я добавил QT += sql
в файл проекта в Qt Creator и рабочий файл minidb.db, и код выполняется правильно, печатает все записи до тех пор, пока l oop закончен и, как говорится в заголовке, не останавливается - true
не меняет состояние на false
каким-либо образом.
Почему это так и как я могу его улучшить? stopps? Я запускаю его на arch linux с sqlite3
#include <QCoreApplication>
#include <QtSql>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSqlDatabase datenbank = QSqlDatabase::addDatabase("QSQLITE");
datenbank.setDatabaseName("/home/jack/minidb.db");
if(datenbank.open() == false)
{
std::cout << "DB not found\n";
return 1;
}
QSqlQuery query;
//query.prepare("SELECT * FROM descriptors WHERE id = ?"); //doesn't make a difference
query.exec("SELECT * FROM adressen");
while(query.next() == true) //not stopping
{
int nummer = query.value(0).toInt();
std::cout << "Nummer: " << nummer << '\n';
QString vorname = query.value(1).toString();
std::cout << "Vorname: " << vorname.toStdString() << '\n';
QString name = query.value(2).toString();
std::cout << "Name: " << name.toStdString() << '\n';
QString strasse = query.value(3).toString();
std::cout << "Strasse: " << strasse.toStdString() << '\n';
QString plz = query.value(4).toString();
std::cout << "PLZ: " << plz.toStdString() << '\n';
QString ort = query.value(5).toString();
std::cout << "Ort: " << ort.toStdString() << '\n';
QString telefon = query.value(6).toString();
std::cout << "Telefon: " << telefon.toStdString() << '\n';
}
datenbank.close();
return a.exec();
}
Также документация qt 5 имеет этот пример без "== true", но не делает разница.
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
Что я делаю не так? Спасибо, ребята, заранее!
(Файл моего проекта, автоматически сгенерированный)
QT -= gui
QT += sql
CONFIG += c++11 console
CONFIG -= app_bundle
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Запись в БД:
[jack@jacks ~]$ sqlite3 minidb.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .database
main: /home/jack/minidb.db
sqlite> CREATE TABLE
...> adressen(
...> ;
Error: near ";": syntax error
sqlite> CREATE TABLE adressen (
...> aNummer INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
...> avorname TEXT NOT NULL,
...> anachname TEXT NOT NULL,
...> astrasse TEXT NOT NULL,
...> aplz TEXT NOT NULL,
...> aort TEXT NOT NULL,
...> atelefon TEXT);
sqlite> INSERT INTO adressen (avorname, anachname, astrasse, aplz, aort)
...> VALUES ('Erwin', 'Mueller', 'Hasenweg 16', '12345', 'Hasenhausen');
sqlite> INSERT INTO adressen (avorname, anachname, astrasse, aplz, aort)
...> VALUES ('Erna', 'Strobelt', 'Birnenplatz 1', '56789', 'Bullerbue');
sqlite> .database
main: /home/jack/minidb.db
sqlite> SELECT * FROM adressen;
1|Erwin|Mueller|Hasenweg 16|12345|Hasenhausen|
2|Erna|Strobelt|Birnenplatz 1|56789|Bullerbue|
sqlite> .exit
[jack@jacks ~]$