Ich verwende den folgenden Code , um die Abfrage mit sqlite
zu aktualisieren.
Aber ich bekomme "database is locked error"
.
Ich habe versucht, einige SO-Link zu suchen und es wurde vorgeschlagen, die Datenbank zu schließen, aber ich habe das wieder der gleiche Fehler bekommen. Ich habe erwähnt, wo ich Fehler im Code bekomme.
Im Allgemeinen erhalten Sie dies, wenn mehrere Abfragen gleichzeitig ausgeführt werden (entweder haben Sie einige frühe SQL-Anweisungen nicht abgeschlossen, oder Sie haben mehrere Threads geöffnet, oder Sie haben die Datenbank mehrmals geöffnet).
Dieser Code hat eine leicht verwirrende Verwendung von sqlite3_close
und sqlite3_reset
(und ein Fehlen von sqlite3_finalize
), was die Ursache des Problems sein könnte.
In Eine Einführung in die SQLite C / C ++ - Schnittstelle weisen sie auf die richtige Reihenfolge der Anweisungen hin:
sqlite3_open()
, um eine Datenbank zu öffnen sqlite3_prepare()
, um eine SQL-Anweisung vorzubereiten sqlite3_bind()
, um Werte an zu binden? Platzhalter nach Bedarf sqlite3_step()
, um sql auszuführen und / oder durch die Ergebnisse zu gehen sqlite3_column()
, um die Datenspalten nach Bedarf abzurufen sqlite3_finalize()
, um die vorbereitete SQL-Anweisung zu vervollständigen / zu schließen sqlite3_close()
, um die Datenbank zu schließen Unterm Strich ist Ihr sqlite3_open
Aufruf nicht mit einem einzelnen sqlite3_close
-Anweisung am Ende (aber Sie haben eine zusätzliche sqlite3_close
in der Mitte Ihres Codes). Außerdem muss jede sqlite3_prepare_v2
eine eigene sqlite3_finalize
(Sie verwenden nur sqlite3_reset
, wenn Sie eine vorbereitete Anweisung zurücksetzen möchten Sie können sie also mit neuen Werten verknüpfen und erneut durchlaufen; Sie benötigen jedoch sqlite3_finalize
, wenn Sie mit der vorbereiteten Anweisung fertig sind.)