天嵌 ARM开发社区

 找回密码
 注册
查看: 3467|回复: 3

请教QT sqlite3定时数据插入segmentation default问题

[复制链接]
一撇一捺 发表于 2014-5-11 17:50:24 | 显示全部楼层 |阅读模式
本帖最后由 一撇一捺 于 2014-5-16 14:44 编辑

自己在QT中连接了sqlite3数据库,要将主窗口几个lineEdit中实时显示的数据定期插入(保存)到数据库中,头文件中新建连接函数connection()如下所示:  #ifndef CONNECTION_H
#define CONNECTION_H
#include<QMessageBox>
#include<QSqlDatabase>
#include<QSqlError>
#include<QSqlQuery>
static bool createConnection()
{
    QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("SensorData.db");
    if(!db.open())
    {
        QMessageBox::critical(0,qApp->tr("Cannot open database"),qApp->tr("Unable to establish a database connection.\n"),QMessageBox::Cancel);
        return false;
    }
    QSqlQuery query;
    query.exec("create table sensordata(ID text,Tem text,Hum text,ZD text,datetime text)");
    return true;
}
#endif // CONNECTION_H
mainwindow.cpp函数中关于插入操作相关代码如下:定义定时器saveTimer=new QTimer(this);点击保存按钮操作函数如下:void MainWindow::on_pushButton_save_clicked()
{
   saveTimer->start(6000);
   connect(saveTimer,SIGNAL(timeout()),this,SLOT(savedata()));
   ui->pushButton_save->setEnabled(false);
}
savedata()实现函数如下:void MainWindow::savedata()
{
    QString id1,id2,id3,tem1,tem2,tem3,hum1,hum2,hum3,zd1,zd2,zd3,newtime;
    QDateTime qdatetime=QDateTime::currentDateTime();
    newtime = qdatetime.toString("yyyy-MM-dd hh:mm:ss");
    id1="1";id2="2";id3="3";
    tem1=lineEdit_3->text();
    hum1=lineEdit_2->text();
    zd1=lineEdit->text();
    tem2=lineEdit_4->text();
    hum2=lineEdit_5->text();
    zd2=lineEdit_6->text();
    tem3=lineEdit_7->text();
    hum3=lineEdit_8->text();
    zd3=lineEdit_9->text();
    /*QSqlDatabase db=QSqlDatabase::database("QSQLITE");
    //db.databaseName("SensorData.db");
    if(!db.open())
    {
        QMessageBox::critical(0,qApp->tr("Cannot open database"),qApp->tr("Unable to establish a database connection.\n"),QMessageBox::Cancel);
        //return false;
        this->close();
    }*/
    if(createConnection())
    {
        QSqlQuery query;
        query.exec("INSERT INTO sensordata VALUES('"+id1+"','"+tem1+"','"+hum1+"','"+zd1+"','"+newtime+"')");
        query.exec("INSERT INTO sensordata VALUES('"+id2+"','"+tem2+"','"+hum2+"','"+zd2+"','"+newtime+"')");
        query.exec("INSERT INTO sensordata VALUES('"+id3+"','"+tem3+"','"+hum3+"','"+zd3+"','"+newtime+"')");
        this->close();
    }
}打开程序时,串口终端会提示Error opening mouse device '/dev/mouse1':No such file or directory(重新添加该驱动后运行程序没出现该提示,可以排除),运行其他程序时也会出现这句话,程序能正常进行下去,点击开始按钮可以正常在几个lineEdit中实时显示串口传过来的数据,当点击保存按钮时一两秒后程序自动退出,终端提示segmentation default。没有其他信息了,进入当前目录,查看数据库SensorData.db下的表,自动生成了sensordata这个表,程序运行前是没有这个表的,说明数据库的连接和表的创建是正常的,不正常的地方应该在上面的插入操作savedata()里面,但是我弄了几天都不知道到底哪块错了,编译都能通过,希望各位看看,给点建议,谢谢了。               
wbz073 发表于 2014-5-12 10:49:32 | 显示全部楼层
仔细检查你的源码
 楼主| 一撇一捺 发表于 2014-5-12 11:06:43 | 显示全部楼层
wbz073 发表于 2014-5-12 10:49
仔细检查你的源码

就是很难检查到才来发帖请教大家的,各个语句都没什么明显的漏洞,关于段错误的原因我在网上也搜了些,最重要的应该是指针,可是我没看出来有什么问题,还有一个就是怀疑是不是没有打开数据库,插入数据会发生段错误,上面的if判断语句可以保证有没有连接成功,连接成功应该就可以插入操作了,去掉if语句和保留if语句,结果运行都是段错误。可能哪个地方漏了吧,目前几天内是比较纠结这个的,一直没发现,依你的经验,可能的原因在哪呢,我再对应着改改看看。
 楼主| 一撇一捺 发表于 2014-5-12 22:42:03 | 显示全部楼层
初步怀疑可能涉及到多线程的问题了,因为两者都要对QLineEdit进行操作,一个是写一个是读,我没有进行多线程类的设计,导致两个线程阻塞,出现错误了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 01:57 , Processed in 1.046875 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表