QT应用编程: 使用SQLITE数据库存放温湿度数据

453 阅读4分钟

一、环境介绍

操作系统:  win10 64位

QT版本: QT5.12.6

编译器:  MinGW 32

二、功能介绍

需要将服务器上传的温度、湿度、经度、纬度、数据存放到数据库,并查询最高温度和最低温度。

三、相关代码

3.1 pro文件

QT       += sql

3.2 创建数据库并新建表

//登录存储数据库名称
#define LOG_IN_DATABASE_NAME "xl_DataBase.db"
//登录数据库连接名称
#define LOG_IN_DATABASE_CONNECT_NAME "qt_sql_login_connection"

 QSqlDatabase database;


 //设置并打开数据库
    if (QSqlDatabase::contains(LOG_IN_DATABASE_CONNECT_NAME))
    {
        database = QSqlDatabase::database(LOG_IN_DATABASE_CONNECT_NAME);
    }
    else
    {
        //数据库类型
        database = QSqlDatabase::addDatabase("QSQLITE",LOG_IN_DATABASE_CONNECT_NAME);
        database.setDatabaseName(LOG_IN_DATABASE_NAME); //数据库名称
        database.setUserName("xl");  //用户名
        database.setPassword("123456"); //密码
    }

    //打开数据库,如果数据库存在就打开,不存在就自动创建
    if(database.open()==false)
    {
        Log_Text_Display("数据库打开失败.请检查程序运行路径和权限.\n");
    }
    else
    {
        Log_Text_Display("连接数据库成功.\n");
    }

    //数据库:  建表,如果存在就不创建,不存在就创建
    QSqlQuery sql_query(database);
    //下面语句查询名称为CarData 的表是否存在.
    sql_query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("CarData"));
    if(sql_query.next())
    {
        if(sql_query.value(0).toInt()==0)
        {
           Log_Text_Display("数据库表是不存在的.准备创建.\n");
           //创建表格 创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
           /* CREATE TABLE 是告诉数据库系统创建一个新表的关键字。
            * CREATE TABLE 语句后跟着表的唯一的名称
            * 或标识*/
           /*下面的语句: 创建一个名称为CarData的表,字段分别是存放 时间、温度、湿度、经度、纬度*/
           QString create_sql = "create table CarData(id int primary key, time varchar(100),temperature varchar(100), humidity varchar(100),longitude varchar(100),latitude varchar(100))";

           sql_query.prepare(create_sql);
           if(!sql_query.exec())
           {
               Log_Text_Display("数据库表创建失败.\n");
           }
           else
           {
               Log_Text_Display("数据库表创建成功.\n");
           }
        }
        else
        {
            Log_Text_Display("数据库表是存在的.不需要创建.\n");
        }
    }

3.3  插入数据

//客户端模式:读取服务器发过来的数据
//温湿度:  #123,456,120.086199,30.139219
//分别表示: 温度、湿度、经度、纬度
void Widget::LocalTcpClientReadDtatSlot()
{
   QString array=LocalTcpClientSocket->readAll();

   QDateTime time = QDateTime::currentDateTime();   //获取系统现在的时间
   QString   time_str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式

   QString text;

   text +=array;
   text +="\n";

   Log_Text_Display(text);

   //解析数据
   if(array.at(0)=='#')
   {
       array.remove('#');
       QString T_str=array.section(',',0,0); //温度
       QString H_str=array.section(',',1,1);  //湿度
       QString jin_str=array.section(',',2,2);  //经度
       QString wei_str=array.section(',',3,4);  //纬度

       ui->label_H->setText(H_str+"%");
       ui->label_Temp->setText(T_str+"℃");
       ui->label_latitude->setText(wei_str);
       ui->label_longitude_jin->setText(jin_str);

       //保存数据到数据库
       QSqlQuery sql_query(database);

       //查询最大ID
       QString select_max_sql = "select max(id) from CarData";
       int max_id = 0;
       sql_query.prepare(select_max_sql);
       if(!sql_query.exec())
       {
           Log_Text_Display("数据库最大ID查找失败.\n");
       }
       else
       {
           while(sql_query.next())
           {
               max_id = sql_query.value(0).toInt();
           }
           Log_Text_Display(QString("data base max id:%1\n").arg(max_id));

           //添加数据
           //插入数据 插入语句:insert into <table_name> values (value1, value2,…);
           QString insert_sql = tr("insert into CarData values(?,?,?,?,?,?)");
           sql_query.prepare(insert_sql);
           sql_query.addBindValue(max_id+1); //id
           sql_query.addBindValue(time_str); //时间
           sql_query.addBindValue(T_str);    //温度
           sql_query.addBindValue(H_str);    //湿度
           sql_query.addBindValue(jin_str);  //经度
           sql_query.addBindValue(wei_str);  //纬度
           if(!sql_query.exec())
           {
              Log_Text_Display("数据插入失败.\n");
           }
       }
   }
}

 

3.4 查询数据

/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 历史最高温度
*/
void Widget::on_pushButton_tempH_clicked()
{
    //指定操作的数据库
    QSqlQuery sql_query(database);
    //查询全部数据
    sql_query.prepare("select * from CarData");
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库查询错误.\n");
    }
    else
    {
        QString T_max_time; //最高温度所在的时间
        int T_max=0; //最高温度
        int t_tmp=0; //当前温度

        QString H_max_time; //最高湿度所在的时间
        int H_max=0; //最高湿度
        int h_tmp=0; //当前湿度

        while(sql_query.next())
        {
           // int id = sql_query.value(0).toInt(); //ID
            QString time = sql_query.value(1).toString(); //时间
            QString T_str = sql_query.value(2).toString(); //温度
            QString H_str = sql_query.value(3).toString(); //湿度
            QString jin_str = sql_query.value(4).toString(); //经度
            QString wei_str = sql_query.value(5).toString(); //纬度

            //比较温度
            t_tmp=T_str.toInt();
            if(t_tmp>T_max)
            {
                T_max=t_tmp;
                T_max_time=time;
            }

            //比较湿度
            h_tmp=H_str.toInt();
            if(h_tmp>H_max)
            {
                H_max=h_tmp;
                H_max_time=time;
            }
        }

        QString show_text=QString("最高温度:%1,时间:%2\n").arg(T_max).arg(T_max_time);
        show_text+=QString("最高湿度度:%1,时间:%2\n").arg(H_max).arg(H_max_time);

        QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_temp_data;
        //设置光标到文本末尾
        plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
        //当文本数量超出一定范围就清除
        if(plainTextEdit_log->toPlainText().size()>1024*4)
        {
            plainTextEdit_log->clear();
        }
        plainTextEdit_log->insertPlainText(show_text);
        //移动滚动条到底部
        QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
        if(scrollbar)
        {
            scrollbar->setSliderPosition(scrollbar->maximum());
        }
    }
}

/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 历史最低温度
*/
void Widget::on_pushButton_tempL_clicked()
{
    //指定操作的数据库
    QSqlQuery sql_query(database);
    //查询全部数据
    sql_query.prepare("select * from CarData");
    if(!sql_query.exec())
    {
        Log_Text_Display("数据库查询错误.\n");
    }
    else
    {
        QString T_min_time; //最低温度所在的时间
        int T_min=28; //最低温度
        int t_tmp=28; //当前温度

        QString H_min_time; //最低湿度所在的时间
        int H_min=80; //最低湿度
        int h_tmp=80; //当前湿度

        while(sql_query.next())
        {
           // int id = sql_query.value(0).toInt(); //ID
            QString time = sql_query.value(1).toString(); //时间
            QString T_str = sql_query.value(2).toString(); //温度
            QString H_str = sql_query.value(3).toString(); //湿度
            QString jin_str = sql_query.value(4).toString(); //经度
            QString wei_str = sql_query.value(5).toString(); //纬度

            //比较温度
            t_tmp=T_str.toInt();
            if(t_tmp<T_min)
            {
                T_min=t_tmp;
                T_min_time=time;
            }

            //比较湿度
            h_tmp=H_str.toInt();
            if(h_tmp<H_min)
            {
                H_min=h_tmp;
                H_min_time=time;
            }
        }

        QString show_text=QString("最低温度:%1,时间:%2\n").arg(T_min).arg(T_min_time);
        show_text+=QString("最低湿度度:%1,时间:%2\n").arg(H_min).arg(H_min_time);

        QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_temp_data;
        //设置光标到文本末尾
        plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
        //当文本数量超出一定范围就清除
        if(plainTextEdit_log->toPlainText().size()>1024*4)
        {
            plainTextEdit_log->clear();
        }
        plainTextEdit_log->insertPlainText(show_text);
        //移动滚动条到底部
        QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
        if(scrollbar)
        {
            scrollbar->setSliderPosition(scrollbar->maximum());
        }
    }
}

 

3.5  清空数据表

/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 清空数据库
*/
void Widget::on_pushButton_clean_data_clicked()
{
    QString cmd;
    cmd = QString("delete from CarData");
    QSqlQuery sql_query(database);
    if(!sql_query.exec(cmd))
    {
        Log_Text_Display("delete table Error.\n");
    }
}

 

3.6  SQLite数据管理工具

数据库存储之后,可以使用 SQLite数据管理工具.exe  进行查看。

下载地址:  download.csdn.net/download/xi…