1

その問題で私を助けてくれることを願っています。基本的には迅速に説明されています。SQLite データベースへのデータベース接続を作成し、データベースを返す単純な関数を作成したので、再度宣言する代わりに "db()" を使用できます。これは以前は他のプロジェクトで機能していましたが、その大部分をコピーしただけなので、どこで問題が発生したのかわかりません....しかし、実行したくないコマンドはすべて2回実行されます。

localdatabase.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

localdatabase.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;
}

main.cpp

#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;ハッシュ
1;f8j39fh3fdh34fg3h4fgtrgr
2;f8j39fh3fdh34fg3h4fgtrgr
3;3freferff343t65j8j787k8k
4;3freferff343t65j8j787k8k
5;h67hgigjggjjonnmkcbldjjsmk6
;h67h67hjjsk

なぜそれをするのかわかりません。foreach を 160,000 までカウントする明示的な整数を使用して while ループに変更しようとしたため、これよりも頻繁にコマンドを実行することはありません....それでも同じ結果です。どういうわけかデータベース宣言を台無しにしましたか?

4

1 に答える 1