====== 13. Qt - databáze ======
Cvičení je zaměřeno na vytvoření jednoduché databazáze, do které se ukládá aktuální cena některé z kryptoměn, např. BTC. Pro získání ceny kryptoměny existuje několik webových API, zde použijeme API [[https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR|cryptocompare.com]].
Základ programu je podobný jako ve cvičení, kde jsme získávali informace o aktuálním počasí. Zde je kód umístěn do třídy, kterou budeme dále rozšiřovat.
/*
kryptomeny.h
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class kryptomeny : public QMainWindow
{
Q_OBJECT
public:
kryptomeny(QWidget *parent = nullptr);
~kryptomeny();
private:
Ui::kryptomeny *ui;
QSqlDatabase db;
QTimer tmr;
void fetchData(void);
};
};
/*
kryptomeny.cpp
*/
#include "kryptomeny.h"
#include "ui_kryptomeny.h"
kryptomeny::kryptomeny(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::kryptomeny)
{
ui->setupUi(this);
// otevreni a pripadne vytvoreni souboru s databazi
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("kryptomeny.db");
db.open();
// vytvoreni objektu pro prikazy databaze
QSqlQuery dbQuery(db);
// vytvoreni tabulky krypto, pokud neexistuje
dbQuery.exec("CREATE TABLE IF NOT EXISTS krypto (dt DATE, USD float);");
// vlozeni 5 vzorku do databaze
for(int i=0; i<5; i++){
dbQuery.exec(QString("INSERT INTO krypto VALUES(DATETIME(), %1);").arg(i));
}
// vyhledani vsech hodnot z SQL databaze z tabulky krypto
dbQuery.exec("SELECT * FROM krypto;");
// vyhledani indexu danych polozek tabulky
QSqlRecord dbRecord = dbQuery.record();
int idDT = dbRecord.indexOf("dt");
int idUSD = dbRecord.indexOf("USD");
// vypsani vsech hodnot z SQL databaze
while(dbQuery.next()){
qDebug() << "Date Time: " << dbQuery.value(idDT).toString()
<< ", Price: " << dbQuery.value(idUSD).toFloat() << " USD";
}
tmr.setInterval(1000);
tmr.start();
QObject::connect(&tmr, &QTimer::timeout, this, &kryptomeny::fetchData);
}
void kryptomeny::fetchData(void){
QNetworkAccessManager mgr;
QNetworkRequest req(QUrl("https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR"));
QNetworkReply *reply = mgr.get(req);
QEventLoop eventLoop;
QObject::connect(&mgr, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
if(reply->error() == QNetworkReply::NoError){
QDateTime dateTime = QDateTime::currentDateTimeUtc();
QJsonDocument json = QJsonDocument::fromJson(reply->readAll());
QJsonObject jsonCrypto = json.object();
qDebug() << dateTime.toString("yyyy-MM-dd hh:mm:ss") << " "
<< jsonCrypto["USD"].toDouble() << " USD";
}
}
===== Kompilace =====
Pro správnou kompilaci programu je třeba do části QT přidat ''sql'' pro databázi, ''network'' pro komunikaci s webovým rozhraním a ''charts'' pro zobrazení dat
# crypto.pro
TEMPLATE = app
TARGET = 01-crypto
QT += widgets network sql charts
CONFIG += console
HEADERS += crypto.h
SOURCES += main.cpp