я как раз ща работаю с бд.
такой код использую:
QSqlDatabase db = QSqlDatabase::database();
if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cities");
if (!db.open()) {
QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
return;
}
// QSqlQuery query;
// query.exec("SELECT * FROM Города;");
// int fieldCity = query.record().indexOf("Город");
// int fieldId = query.record().indexOf("Ид");
// int fieldCountry = query.record().indexOf("Страна");
// int fieldRegion = query.record().indexOf("Регион");
// qDebug() << endl << "fieldCity" << fieldCity;
// qDebug() << "fieldId" << fieldId;
// qDebug() << "fieldCountry" << fieldCountry;
// qDebug() << "fieldRegion" << fieldRegion;
// City city;
// QList<City> cities;
// while (query.next()) {
// city.name = query.value(fieldCity).toString();
// city.id = query.value(fieldId).toString();
// city.country = query.value(fieldCountry).toString();
// city.region = query.value(fieldRegion).toString();
// qDebug() << "City" << city.name << "Id" << city.id << "Country" << city.country << "Region" << city.region;
// cities.append(city);
// }
единожды выполнив соединение с бд и ее открытие, до тех пор пока бд явно не закрыта
можно в любом методе класса работать с бд таким образом:
QSqlQuery query;
if (!city.isEmpty()) {
query.exec("SELECT * FROM Города WHERE Город='" + city + "' AND Страна='" + country + "' AND Регион='" + region + "';");
} else if (!region.isEmpty()) {
query.exec("SELECT * FROM Регионы WHERE Регион='" + region + "' AND Страна='" + country + "';");
city = country + ", " + region;
} else if (!country.isEmpty()) {
query.exec("SELECT * FROM Страны WHERE Страна='" + country + "';");
city = country;
}
if (!query.first()) {
query.exec("SELECT * FROM Метро WHERE Метро='" + city + "' AND Страна='" + country + "' AND Город='" + region + "';");
if (query.first())
city = region + " (" + city + ")";
}
QString id = query.value(query.record().indexOf("Ид")).toString();
qDebug() << endl << "city" << city << "id" << id << "country" << country << "region" << region;
но если вы явно закроете бд, то придется делать так:
QSqlDatabase db = QSqlDatabase::database();
if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cities");
if (!db.open()) {
QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
return;
}
QSqlQuery query;
foreach (QString cityTmp, citiesInsert) {
QStringList cityParts = cityTmp.split("|");
if (cityParts.count() >= 4) {
QString city = cityParts.at(0);
QString id = cityParts.at(1);
QString country = cityParts.at(2);
QString region = cityParts.at(3);
query.exec("INSERT INTO Города(Город, Ид, Страна, Регион) VALUES ('" + city + "', '" + id + "', '" + country + "', '" + region + "');");
//query.exec("INSERT INTO Метро(Метро, Ид, Страна, Регион) VALUES ('" + city + "', '" + id + "', '" + country + "', '" + region + "');");
}
}
я работаю с бд в динамически создаваемом диалоге, поэтому у меня бд открыта пока не закрыт диалог.
закрывается ли бд, при уничтожении db, когда тот выходит из области видимости стека, я точно не знаю.
универсально, в каждый метод где нужна бд, добавить:
QSqlDatabase db = QSqlDatabase::database();
if (db.connectionName().isEmpty()) db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("cities");
if (!db.open()) {
QMessageBox::warning(this, qApp->applicationName(), QString("Не открывается бд с городами: %1").arg(db.databaseName()));
return;
}
и таким образом делать запросы:
QSqlQuery query;
query.exec("SELECT * FROM Города;");
int fieldCity = query.record().indexOf("Город");
int fieldId = query.record().indexOf("Ид");
int fieldCountry = query.record().indexOf("Страна");
int fieldRegion = query.record().indexOf("Регион");
qDebug() << endl << "fieldCity" << fieldCity;
qDebug() << "fieldId" << fieldId;
qDebug() << "fieldCountry" << fieldCountry;
qDebug() << "fieldRegion" << fieldRegion;
while (query.next()) {
qDebug() << "city" << query.value(fieldCity).toString() << "id" << query.value(fieldId).toString() << "country" << query.value(fieldCountry).toString() << "region" << query.value(fieldRegion).toString();
}