QByteArray sqlite BLOB Bedingung



  • Momentan stehe ich vor einem Problem und weiß leider nicht wie ich das lösen soll.
    Ich habe eine sqlite Datenbank mit BLOB Feldern. Dort speichere ich QByteArrays rein.

    Ein Feld nennt sich title. Nun kann ich leider nicht diesen Wert der da drin steht vergleichen. Zuerst mal etwas Code.

    QSqlQuery query;
        qDebug() << title;
        query.prepare("SELECT situation_field, emotion_field, mind_field, strength FROM event "
                      "WHERE title = CAST((:title) AS BLOB) AND date = (:date)");
        query.bindValue(":title", title));
        query.bindValue(":date", date.toString());
        if (query.exec())
        {
            if (query.first())
            {
                *situation = query.value(0).toByteArray();
                *emotion = query.value(1).toByteArray();
                *mind = query.value(2).toByteArray();
                *strength = query.value(3).toInt();
            }
        }
    

    In diesem Code ist der Query immer leer. Das liegt aber daran, dass die Bedingung auch nie zutrifft. Ich habe aber folgendes heraus finden können.
    In der Datenbank steht zB bei title folgender Wert drin

    109,251,142,174,192,243,76,229,188,58,71,65,2,80,24,210,135,129,93,140,208,184,227,204,12,235,58,239,103,51,213,115

    aber in der Variable title die ich übergebe steht folgendes drin.

    ";\xD0\xB1J\xF0""2J\x17\xBFl\xE0=6c\xCDN\x8E\xB7Z\xB6\xDD""C\x91\xDA\x8D^\xA5""e\xC4\xA2\xC3""C\xFB\xA2\xF5\x19\x9DOJ\x14\x89\x16\x87pA:\xB2\xDF"

    die Variable ist ein verschlüsselter QByteArray und der Wert in der Datenbank kommt zu stande, wenn ich einen QByteArray in die Datenbank eintrage.

    Kann es sein, dass ich bei diesem Abschnitt was umwandeln muss?

    query.bindValue(":title", title));
    

    Ich bin ratlos.

    edit: ich hab mal im offiziellem qt forum einen ähnlichen beitrag erstellt.
    https://forum.qt.io/topic/67188/problem-with-qbytearray-and-blob-entry-in-database



  • Niemand eine Idee wie ich den Wert in der Datenbank mit meiner Variable vergleichen kann? Hab die Variable schon in alles mögliche umgewandelt. Aber wenn ich den QByteArray mit dem Wert in der Datenbank vergleichen will kommt bei meinem Select immer 0 raus.

    Ich hab auch schon versucht den wert in der query zu blob zu casten, aber irgendwie funktioniert einfach nichts.



  • Bennisen schrieb:

    Niemand eine Idee wie ich den Wert in der Datenbank mit meiner Variable vergleichen kann? Hab die Variable schon in alles mögliche umgewandelt. Aber wenn ich den QByteArray mit dem Wert in der Datenbank vergleichen will kommt bei meinem Select immer 0 raus.

    Ich hab auch schon versucht den wert in der query zu blob zu casten, aber irgendwie funktioniert einfach nichts.

    Ich verstehe immer noch nicht, _was_ Du eigentlich in die DB geschrieben hast?!



  • Furble Wurble schrieb:

    Bennisen schrieb:

    Niemand eine Idee wie ich den Wert in der Datenbank mit meiner Variable vergleichen kann? Hab die Variable schon in alles mögliche umgewandelt. Aber wenn ich den QByteArray mit dem Wert in der Datenbank vergleichen will kommt bei meinem Select immer 0 raus.

    Ich hab auch schon versucht den wert in der query zu blob zu casten, aber irgendwie funktioniert einfach nichts.

    Ich verstehe immer noch nicht, _was_ Du eigentlich in die DB geschrieben hast?!

    Einen QByteArray der vorher verschlüsselt wurde. Da ich das hier gelesen habe.

    BLOB - The value is a blob of data, stored exactly as it was input

    hab ich an dem QByteArray nichts geändert und ihn quasi so wie er ist in die Datenbank geschrieben.

    Update:

    hier mal mein insert query.

    void GDatabase::insertEvent(QByteArray &title, QByteArray &situation, QByteArray &emotion,
                     QByteArray &mind, int strength, QDate date)
    {
        QMessageBox msgBox;
        QSqlQuery query;
        query.prepare("INSERT INTO event (title, situation_field, emotion_field, mind_field, strength, date) VALUES "
                      "(:title, :situation, :emotion, :mind, :strength, :date)");
        query.bindValue(":title", title);
        query.bindValue(":situation", situation);
        query.bindValue(":emotion", emotion);
        query.bindValue(":mind", mind);
        query.bindValue(":strength", strength);
        query.bindValue(":date", date.toString());
        if (!query.exec())
        {
            qDebug() << query.lastError();
            msgBox.setText("Konnte das Event nicht anlegen. Versuchen sie es bitte noch einmal.");
            msgBox.exec();
        }
    }
    


  • Gibt es denn niemand der eine Idee hat? Ich verzweifel langsam. Sogar wenn ich im SELECT Befehl nach dem Wert in der Datenbank suche liefert mir der Query nichts zurück.

    "SELECT situation_field, emotion_field, mind_field, strength FROM event "
                      "WHERE title = '163,46,15,121,250,184,66,196,180,34,12,40,110,10,168,30,246,105,61,150,87,39,67,131,226,101,76,157,29,69,196,244'"
    

    Wenn ich anstatt BLOB ein TEXT Feld nutze und den QByteArray in einen QString umwandel fügt er mir in die Datenbank lauter Zeichen ein die er nicht kennt. Kann ich den QString irgendwie für utf8 umcodieren?

    update: tut mir leid das ich hier so rumnerve, aber ich bin meiner Sache etwas näher gekommen. Ich wußte nicht das beim verschlüsseln immer andere Werte am Ende rauskommen. Egal ob ich den selben Text verschlüssel. So kann ich natürlich schlecht nach einem Wert suchen, wenn die verschlüssten variablen nicht gleich sind.

    update 2: habs nun gelöst. Wäre aber zu kompliziert um das alles hier jetzt zu erklären 🙂


Log in to reply