12. 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 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 <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
 
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
 
#include <QtCharts>
#include <QDateTime>
#include <QTimer>
 
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlRecord>
 
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

courses/b2b99ppc/tutorials/12.txt · Last modified: 2024/02/26 13:54 by nentvond