sqlite 데이터베이스와의 모든 데이터를 처리해야하는 클래스를 만들려고합니다. 그러나 나는 QT와 C++에 대해 매우 익숙하며 클래스의 데이터베이스 객체 선언에 대해 궁금해합니다. 나는 옳고 그름을하고 있으며 어떻게 정상적으로 수행되어야하는지, 할 수 있는지에 대한 몇 가지 팁을 필요로 할 수 있습니다. 내 목표는 클래스에 대한 단일 QSqlDatabase를 만들고 클래스 내의 모든 함수에 사용하는 것이 었습니다. 순간Qt : 클래스의 QSqlDatabase 객체 (선언 방법)
, 나는 다음과 같은 코드가 있습니다
MAIN.CPP
#include "mainwindow.h"
#include "database.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Database db;
MainWindow w;
if(db.createStructure())
{
w.show();
}
return a.exec();
}
database.h
#ifndef DATABASE_H
#define DATABASE_H
#include <QObject>
#include <QSqlDatabase>
class Database : public QObject
{
Q_OBJECT
public:
explicit Database(QObject *parent = 0);
// FUNCTIONS
bool createStructure();
signals:
public slots:
private:
// VARIABLES
QSqlDatabase m_db;
// FUNCTIONS
bool open();
void close();
bool transaction();
bool commit();
};
#endif // DATABASE_H
database.cpp
#include "database.h"
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QList>
Database::Database(QObject *parent) :
QObject(parent)
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setHostName("localhost");
m_db.setDatabaseName(QCoreApplication::applicationDirPath() + "/events.db");
}
// PRIVATE
bool Database::open()
{
return m_db.open();
}
void Database::close()
{
return m_db.close();
}
bool Database::transaction()
{
return m_db.transaction();
}
bool Database::commit()
{
return m_db.commit();
}
// PUBLIC
bool Database::createStructure()
{
bool prepared;
QList<QString> commands;
commands.append("CREATE TABLE...;");
commands.append("CREATE TABLE...;");
commands.append("CREATE TABLE...;");
if (!Database::open())
{
return false;
}
else
{
if (!Database::transaction())
{
Database::close();
return false;
}
else
{
foreach(QString command, commands)
{
QSqlQuery query;
prepared = query.prepare(command);
if(!prepared)
{
if (!Database::commit())
{
Database::close();
return false;
}
else
{
Database::close();
return false;
}
}
else
{
if(!query.exec())
{
if (!Database::commit())
{
Database::close();
return false;
}
else
{
Database::close();
return false;
}
}
}
}
if (!Database::commit())
{
Database::close();
return false;
}
else
{
Database::close();
return true;
}
}
}
}
이 코드를 일하고있다.
그러나, QSQLITE 데이터베이스는 m_db 객체에 대한 하나의 시간을 추가하지 않고, 모든 시간은 클래스의 함수를 호출 때문에 ...
Database::Database(QObject *parent) :
QObject(parent)
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setHostName("localhost");
m_db.setDatabaseName(QCoreApplication::applicationDirPath() + "/events.db");
}
은 ... 코드 블록마다 실행됩니다 시각. 현재 기본 연결이 바뀌 었습니다. 새 연결이 동일하기 때문에 프로그램에 아무런 영향도 미치지 않지만 깔끔한 솔루션처럼 보이지는 않습니다.
그래서 나는 한 번 MAIN.CPP에서 호출 할 수있는 선언 기능이 코드 블록 ...MAIN.CPP을 대체하려고
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Database db;
MainWindow w;
db.declare(“QSQLITE”, “localhost”, QCoreApplication::applicationDirPath() + "/events.db");
if(db.createStructure())
{
w.show();
}
return a.exec();
}
database.cpp
void Database::declare(QString driver, QString host, QString path)
{
m_db = QSqlDatabase::addDatabase(driver);
m_db.setHostName(host);
m_db.setDatabaseName(path);
}
...하지만 m_db 객체의 값은 물론 declare-function 내에서만 사용할 수 있으며 나중에 호출하는 다른 함수에서는 사용할 수 없습니다.
MAIN.CPP
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSqlDatabase qdb = QSqlDatabase::addDatabase("QSQLITE");
qdb.setHostName("localhost");
qdb.setDatabaseName(QCoreApplication::applicationDirPath() + "/events.db");
Database db;
MainWindow w;
if(db.createStructure(qdb))
{
w.show();
}
return a.exec();
}
database.cpp
:솔루션에 대한 나의 추측은 MAIN.CPP에 QSqlDatabase를 선언하고 호출해야하는 함수에 제공하는 것
bool Database::open(QSqlDatabase qdb)
{
return qdb.open();
}
void Database::close(QSqlDatabase qdb)
{
return qdb.close();
}
bool Database::transaction(QSqlDatabase qdb)
{
return qdb.transaction();
}
bool Database::commit(QSqlDatabase qdb)
{
return qdb.commit();
}
bool Database::createStructure(QSqlDatabase qdb)
{
bool prepared;
QList<QString> commands;
commands.append("CREATE TABLE...;");
commands.append("CREATE TABLE...;");
commands.append("CREATE TABLE...;");
if (!Database::open(qdb))
{
return false;
}
else
{
if (!Database::transaction(qdb))
{
Database::close(qdb);
return false;
}
else
{
foreach(QString command, commands)
{
QSqlQuery query;
prepared = query.prepare(command);
if(!prepared)
{
if (!Database::commit(qdb))
{
Database::close(qdb);
return false;
}
else
{
Database::close(qdb);
return false;
}
}
else
{
if(!query.exec())
{
if (!Database::commit(qdb))
{
Database::close(qdb);
return false;
}
else
{
Database::close(qdb);
return false;
}
}
}
}
if (!Database::commit(qdb))
{
Database::close(qdb);
return false;
}
else
{
Database::close(qdb);
return true;
}
}
}
}
다시 사용할 수있는 QSqlDatabase 개체를 클래스에 저장할 수 있습니까? 그렇다면 어떻게? 정말 감사드립니다!
EDIT 1
내가있는 기능을 사용하고 디자이너에서 생성 된 일부 코드입니다.
void MainWindow::on_pushButton_24_clicked()
{
Database db;
bool b = db.createStructure();
QMessageBox::information(this, "test", QString(b));
}
이것은별로 의미가 없습니다. _how_ 데이터베이스 클래스를 사용하고 있음을 표시하십시오. 사용하도록 설계된 것처럼 사용하지 않는 것 같습니다. – Mat
데이터베이스 클래스는 신호와 슬롯에있는 gui 프로그램에 사용됩니다. 버튼을 클릭하십시오 -> 데이터베이스 마술을하십시오. 디자인 할 때 이미 코드를 망칠 가능성은 완전히 있습니다. 나는 당신이 "당신이 그것을 어떻게 사용하는지 보여준다"는 것이 무엇을 의미하는지 정말로 확신하지 못합니다. 그것은 실행될 수있는 데이터베이스 기능을 가진 클래스 일뿐입니다. : -/ – Endauriel
Database 클래스를 사용하는 일부 코드를 보여줍니다. – Mat