SQLite는 MySQL나 PostgreSQL와 같은 데이터베이스 관리 시스템이지만, 서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다. Qt SQL을 이용해서 가벼운 데이터베이스를 다루어보자.
가장 먼저 프로젝트 파일에 다음과 같이 명시한다.
QT += sql
소스파일에는 다음과 같이 추가한다.
#include <QtSql>
이제 프로젝트에서 Qt SQL 클래스들을 사용할 수 있다. http://doc.qt.io/qt-5/qtsql-module.html
아래는 데이터베이스를 핸들링하는 간단한 예제이다.
sqldatabase.h
#include <QObject>
#include <QtSql>
class SQLDatabase: public QObject
{
Q_OBJECT
public:
SQLDatabase(QObject *parent = nullptr);
QSqlError addConnection(const QString &driver, const QString &dbName, const QString &name);
void exec(const QString& q);
void exec(const QString& q, QVariantList& data);
private:
QString activeDb;
};
sqldatabase.cpp
#include "sqldatabase.h"
SQLDatabase::SQLDatabase(QObject *parent)
:QObject (parent)
{
if (QSqlDatabase::drivers().isEmpty())
qDebug() << "No database drivers found This demo requires at least one Qt database driver. "
"Please check the documentation how to build the "
"Qt SQL plugins.";
}
QSqlError SQLDatabase::addConnection(const QString &driver, const QString &dbName, const QString &name)
{
QSqlError err;
QSqlDatabase db = QSqlDatabase::addDatabase(driver, QString("%1").arg(name));
db.setDatabaseName(dbName);
if (!db.open()) {
err = db.lastError();
db = QSqlDatabase();
QSqlDatabase::removeDatabase(QString("%1").arg(name));
}
activeDb = name;
return err;
}
void SQLDatabase::exec(const QString &q)
{
QSqlQuery query(QSqlDatabase::database(activeDb));
query.prepare(q);
query.exec();
}
void SQLDatabase::exec(const QString& q, QVariantList& data)
{
QSqlQuery query(QSqlDatabase::database(activeDb));
query.prepare(q);
query.exec();
while (query.next()) {
QSqlRecord record = query.record();
int count = record.count();
QVariantMap map;
for(int i = 0; i < count; ++i) {
map[record.field(i).name()] = record.value(i);
}
data.push_back(map);
}
}
main.cpp
#include "sqldatabase.h"
int main(int argc, char *argv[])
{
SQLDatabase database;
auto path = QString("%1%2").arg(qApp->applicationDirPath()).arg("/phonebook.db");
QSqlError err = database.addConnection("QSQLITE", path, "phonebook");
if (err.type() != QSqlError::NoError)
qDebug() << QString("%1,%2").arg("Unable to open database An error occurred while opening the connection: " + err.text());
/* create */
database.exec("create table phonebook (id int primary key, "
"name TEXT NOT NULL, number INT NOT NULL)");
/* insert */
database.exec("insert into phonebook values(102, 'makersweb', '1012341234')");
/* select */
QString id("102");
QVariantList data;
database.exec("select * from phonebook where id = " "'" + id + "'", data);
for(const auto &item: data){
auto map = item.toMap();
qDebug() << map["number"].toInt();
}
}
실제 만들어진 db를 열어보면 아래 그림과 같이 확인할 수 있다.
2020.05.20 08:55
한글같은 유니코드 문자를 sql 쿼리의 컬럼 값으로 쓰려면 어떻게 해야 할까요?