希望你能帮助我解决这个问题,基本上它很快就得到了解释。我与 SQLite 数据库建立了数据库连接,并编写了一个简单的函数来返回数据库,这样我就可以使用“db()”而不是再次声明它。这在之前对其他项目有效,我只是复制了其中的大部分内容,所以我真的不知道哪里出错了……但是我不想执行的每个命令都执行了两次。
本地数据库.h
#ifndef LOCALDATABASE_H
#define LOCALDATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QStringList>
class LocalDatabase : public QObject
{
Q_OBJECT
public:
explicit LocalDatabase(QObject *parent = 0);
void initialize();
bool insertHashValues(QStringList allHash);
private:
QSqlDatabase db();
};
#endif // LOCALDATABASE_H
本地数据库.cpp
#include "localdatabase.h"
LocalDatabase::LocalDatabase(QObject *parent) :
QObject(parent)
{
}
QSqlDatabase LocalDatabase::db()
{
return QSqlDatabase::database();
}
void LocalDatabase::initialize()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("127.0.0.1");
db.setDatabaseName("C:/temp/data.db");
db.setConnectOptions("Count Changes=off;pooling=true;Cache Size=10000;Page Size=4096;Synchronous=off;");
}
bool LocalDatabase::insertHashValues(QStringList allHash)
{
bool result = true;
if(!db().open()) return false;
db().transaction();
foreach(QString hash, allHash)
{
QSqlQuery q("INSERT INTO hash (hash) VALUES ('" + hash + "');", db());
if(!q.exec())
{
result = false;
break;
}
}
db().commit();
db().close();
return result;
}
主文件
#include <QApplication>
#include "mainwindow.h"
#include "localdatabase.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
LocalDatabase ldb;
ldb.initialize();
// ***
// Writing Hash-Keys into the StringList "allHash"
// ***
ldb.insertHashValues(allHash);
return a.exec();
}
StringList "allHash" 包含大约 160,000 个哈希值....也在调试中检查了这一点。这应该会导致数据库中有 160,000 个条目,但最后我执行了 320,000 个查询。
然后数据库如下所示:
id;hash
1;f8j39fh3fdh34fg3h4fgtrgr
2;f8j39fh3fdh34fg3h4fgtrgr
3;3freferff343t65j8j787k8k
4;3freferff343t65j8j787k8k
5;h67hgigjggjjonnmkcbldjjs
6;hcbljjnmg
我不知道为什么会这样。尝试将 foreach 更改为 while 循环,其中显式整数计数为 160,000,因此它不会比这更频繁地执行命令....仍然是相同的结果。我是否以某种方式弄乱了数据库声明?