2013-04-30 4 views
1

У меня вопрос относительно использования баз данных в Qt.Использование базы данных Qt в большом приложении

В других языках я бы сделал что-то вроде создания базы данных в основном классе и передал указатель этой базы данных другим классам, которые будут использоваться.

Я играл в Qt, и кажется, что если я инициализирую базу данных в основном классе, тогда я могу просто написать и выполнить запрос в любом другом классе, и он будет использовать эту базу данных, и я немного смущен, потому что похоже, нет ссылки на базу данных.

Может кто-нибудь объяснить это для меня :)

Вот класс базы данных, который инстанс в mainwindow.cpp

#include "database.h" 

Database::Database() 
{ 
    Connect(); 
} 

void Database::Connect() 
{ 
    db = QSqlDatabase::addDatabase("QSQLITE"); 
    db.setDatabaseName("mydatabase­.dat"); 

    if(db.open()){ 
     qDebug() << "Connected"; 
    } 
    else 
    { 
     qDebug() << "Not Connected"; 
    } 
} 

bool Database::SetupTables() 
{ 
    QSqlQuery qry; 

    qry.exec("CREATE TABLE patients (patient_id INT, firstname VARCHAR(100), lastname VARCHAR(100)); "); 

    return true; 
} 

Вот окно (Widget) я создал называется PatientList

#include "patientlist.h" 
#include "ui_patientlist.h" 
#include "database.h" 
#include <QtSql> 
#include <QtDebug> 

PatientList::PatientList(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::PatientList) 
{ 
    ui->setupUi(this); 

    QSqlQuery qry; 
    if(qry.exec("SELECT patient_id,firstname,lastname FROM patients")){ 
     qDebug() << "Success"; 
    } 
    else 
    { 
     qDebug() << "Error"; 
    } 

} 

PatientList::~PatientList() 
{ 
    delete ui; 
} 

Все это работает нормально, но я просто чувствую, что я делаю что-то неправильно, потому что я не упомянул базу данных, созданную в MainWindow.cpp

+0

Можете ли вы показать нам пример кода? Это невероятно неопределенно – cppguy

+0

Добавлено в сообщение – Liam

ответ

0

Ну, не видя, что ваш главный затрудняет работу, но похоже, что QSqlQuery достаточно умен, чтобы забрать вашу базу данных по умолчанию. Смотрите здесь:

http://qt-project.org/doc/qt-4.8/qsqlquery.html#QSqlQuery-2

Так до тех пор, как вы видите, значение в вашем дб, я бы сказал, что это просто еще один пример того, Qt делает что-то не обязательно интуитивное, но в конечном счете, очень просто в использовании.

2

Из Qt документации на QSqlDatabase:

Соединение известно под своим собственным именем, а не именем базы данных она соединяет. Вы можете иметь несколько подключений к одной базе данных . QSqlDatabase также поддерживает концепцию подключения по умолчанию , которое является неназванным соединением. Чтобы создать соединение по умолчанию , не пропустите аргумент имени соединения при вызове addDatabase(). Впоследствии, когда вы вызываете какую-либо статическую функцию-член , которая принимает аргумент имени соединения, если вы не передаете аргумент имени соединения , предполагается соединение по умолчанию.

Ну, я думаю, это все говорит. Обратите внимание, что QSqlDatabase не может быть напрямую создан. Прямой экземпляр создания QSqlDatabase приведет к недействительному соединению. По-видимому, QSqlDatabase - это только ссылки на фактические объекты соединения (вероятно, статически). Поскольку многие приложения могут использовать только одно соединение с базой данных, по умолчанию выделяется одна ссылка.

Я не уверен, что это делается для каждого приложения или для каждой нити.

Смежные вопросы