Fehler "Datenbank gesperrt" in ios beim Aktualisieren der Abfrage

8

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.

%Vor%     
2vision2 31.07.2013, 12:27
quelle

1 Antwort

11

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

    
Rob 31.07.2013, 12:41
quelle

Tags und Links