sqlite3 + QThread实现数据库线程

.h文件

class SqlThread : public QThread
{
	Q_OBJECT
public:
	SqlThread(QString threadName, sqlite3* db);
	~SqlThread();
	void setMessage(const QString &message);
	QString getMessage();
	void stop();
	QString getThreadName();
	int pushData(std::string sqlData);//提供给外部接口(仅支持:插入或删除数据)
	
protected:
	void run();

private:
	volatile bool stopped;
	QMutex mutex;
	QMutex mutex1;
	QString m_szThreadName;
	sqlite3 *m_pDb;
	QString m_szMessage;
	std::vector<std::string> m_OutSqlVec; //存sql语句
};

.cpp文件

SqlThread::SqlThread(QString threadName, sqlite3* db)
{
	m_szThreadName = threadName;
	m_pDb = db;
	stopped = false;
}

SqlThread::~SqlThread()
{
	m_OutSqlVec.clear();
}

void SqlThread::setMessage(const QString &message)
{
	m_szMessage = message;
}

QString SqlThread::getMessage()
{
	qDebug() << "sql thread is alive. message:" << m_szMessage;
	return m_szMessage;
}

void SqlThread::stop()
{
	qDebug() << m_szThreadName << "线程退出";
	stopped = true;
}

QString SqlThread::getThreadName()
{
	return m_szThreadName;
}

/**
* @func:    pushData
* @brief:   提供给外部接口的函数,提供数据库插入和删除
* @author:  xxx
* @param:   sqlData: sql语句
* @return:  是否加到了队列里
*/
int SqlThread::pushData(std::string sqlData)
{
	if (sqlData != "")
	{
		mutex.lock();
		m_OutSqlVec.push_back(sqlData);
		mutex.unlock();
		return 0;
	}
	else
	{
		return  -1;
	}
	
}

/**
* @func:    run
* @brief:   线程run函数
* @author:  xxx
* @param:   void
* @return:  void
*/
void SqlThread::run()
{	
	forever
	{	
		if (stopped)
		{
			stopped = false;
			break;
		}
		if (m_OutSqlVec.size() == 0)
		{
			sleep(1);
		}
		//qDebug() << "sql thread is running.";
		//进行数据存储操作
		std::vector<std::string> SqlVec; //sql语句
		if (m_OutSqlVec.size() > 0)
		{
			mutex.lock();
			std::copy(m_OutSqlVec.begin(), m_OutSqlVec.end(), std::back_inserter(SqlVec));
			m_OutSqlVec.clear();
			mutex.unlock();
		}
		if (SqlVec.size() > 1)
		{
			SqliteExec(m_pDb, "BEGIN TRANSACTION");
			qDebug() << "执行语句共:" << SqlVec.size();
			for (int i = 0; i < SqlVec.size(); i++)
			{
				std::string szsql = SqlVec[i];
				//int rc = sqlite3_exec(m_pDb, (char*)szsql.c_str(), NULL, NULL, 0);
				int rc = SqliteExec(m_pDb, (char*)szsql.c_str());
				if (rc != SQLITE_OK)
				{
					qDebug() <<StrToQStr(SqlVec[i].c_str()) << "执行失败";
				}
			}
			int nRet = SqliteExec(m_pDb, "END TRANSACTION");
			if (nRet != SQLITE_OK)
			{
				printf("sql insert fail-------%d\n", nRet);
			}		
		}
		SqlVec.clear();
	}
}

调用该线程 //我做的时候是放在单例类里做的,当时还自己给自己埋了个坑,在单例列的析构里执行了delete sqlThread,但是没有赋值NULL,这就导致下一次想创建线程就不行了,因为线程指针已经是随机的了。

if (db_ &&     sqlThread == NULL)
    {
        qDebug() << "创建线程 sql thread.";
        sqlThread = new SqlThread("sql thread", db_);
        sqlThread->start();
    }

在其他地方调用:

char buf[500];
            sprintf(buf, "delete from setting where name = '%s' and address = '%s'", pied->name_, pframe->m_table->item(i, 2)->text().toUtf8().data());
            单例类::Instance()->sqlThread->pushData(buf);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个Python编程语言的工具包,用于创建图形用户界面(GUI)。SQLite是一个轻量级的嵌入式数据库引擎,它可以轻松地集成到应用程序中。QTableWidget是PyQt5中一个用于显示和编辑二维表格数据的小部件。 在PyQt5中,使用QTableWidget来显示SQLite数据库中的数据,可以按照以下步骤进行操作: 1. 首先,导入需要的模块:`from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem` 并连接到SQLite数据库:`import sqlite3` 2. 创建一个继承自QMainWindow的自定义窗口类,并在窗口的初始化方法中设置布局等属性。 3. 创建一个QTableWidget实例,并设置它的行数和列数:`table = QTableWidget(row_count, col_count)` 4. 连接到SQLite数据库:`conn = sqlite3.connect('your_database.db')` 5. 创建一个游标对象:`cursor = conn.cursor()` 6. 执行SQL查询语句获取数据库中的数据:`cursor.execute('SELECT * FROM your_table')` 7. 使用fetchall()方法获取查询结果:`data = cursor.fetchall()` 8. 遍历查询结果,并将数据逐行添加到QTableWidget中:`for row_number, row_data in enumerate(data):` `for column_number, column_data in enumerate(row_data):` `table.setItem(row_number, column_number, QTableWidgetItem(str(column_data)))` 9. 最后,关闭数据库连接:`conn.close()` 10. 将QTableWidget添加到窗口的主布局中:`self.setCentralWidget(table)` 通过以上步骤,就可以使用PyQt5和SQLite数据库来显示自定义表格数据。在需要时,可以根据需求对QTableWidget进行自定义样式的设置,例如设置列宽、行高、表头等。 希望以上回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值