QT案例 QT用多种单例模式实现读写数据Sqlite数据库数据,并多线程调用
在Qt中,可以使用多种单例模式来实现对Sqlite数据库的读写操作,并且支持多线程。以下是一个简单的例子,展示了如何使用Qt的QSqlDatabase
类和QThread
类来实现这个需求。
首先,定义一个单例类,用于数据库的读写操作:
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMutex>
#include <QMutexLocker>
class DatabaseManager : public QObject {
Q_OBJECT
public:
static DatabaseManager* instance() {
static DatabaseManager instance;
return &instance;
}
// 初始化数据库连接
void initDatabase() {
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("your_database_name.db");
bool ok = db.open();
// 检查数据库是否打开成功
Q_ASSERT(ok);
Q_UNUSED(ok);
}
// 写入数据到数据库
void writeData(const QString &query) {
QSqlQuery sqlQuery;
if (!sqlQuery.exec(query)) {
qDebug() << "Database write error:" << sqlQuery.lastError();
}
}
// 从数据库读取数据
QSqlQuery readData(const QString &query) {
QSqlQuery sqlQuery;
if (sqlQuery.exec(query)) {
return sqlQuery; // 返回查询结果
} else {
qDebug() << "Database read error:" << sqlQuery.lastError();
return QSqlQuery(); // 返回无效的查询对象
}
}
private:
DatabaseManager() {}
~DatabaseManager() {
QSqlDatabase::removeDatabase("connection_name");
}
Q_DISABLE_COPY(DatabaseManager)
};
然后,你可以在多线程环境中这样使用这个单例:
#include <QThread>
#include <QDebug>
class DatabaseWorker : public QThread {
Q_OBJECT
public:
void run() override {
// 在这里,你可以安全地进行数据库操作
auto data = DatabaseManager::instance()->readData("SELECT * FROM your_table");
while(data.next()) {
qDebug() << data.value(0).toString(); // 输出查询结果
}
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 初始化数据库
DatabaseManager::instance()->initDatabase();
// 创建并启动线程
DatabaseWorker worker;
worker.start();
return app.exec();
}
在这个例子中,DatabaseManager
是一个单例,用于初始化数据库连接和执行数据库操作。DatabaseWorker
类继承自QThread
,在其run
函数中执行数据库读取操作。在main
函数中,我们初始化数据库,创建并启
评论已关闭