Wie verwende ich vorbereitete Anweisungen in SQlite in Android?
android
sqlite
prepared-statement
pupeno
quelle
quelle
Antworten:
Ich verwende die ganze Zeit vorbereitete Anweisungen in Android, es ist ganz einfach:
quelle
SQLiteStatement.bindXXX()
es einen 1-basierten Index gibt, der nicht wie die meisten auf 0 basiert.Für vorbereitete SQLite-Anweisungen in Android gibt es SQLiteStatement . Mit vorbereiteten Anweisungen können Sie die Leistung beschleunigen (insbesondere bei Anweisungen, die mehrmals ausgeführt werden müssen) und Einspritzangriffe vermeiden. In diesem Artikel finden Sie eine allgemeine Diskussion zu vorbereiteten Aussagen.
SQLiteStatement
soll mit SQL-Anweisungen verwendet werden, die nicht mehrere Werte zurückgeben. (Das bedeutet, dass Sie sie für die meisten Abfragen nicht verwenden würden.) Nachfolgend einige Beispiele:Erstellen Sie eine Tabelle
Die
execute()
Methode gibt keinen Wert zurück, daher ist die Verwendung mit CREATE und DROP angemessen, jedoch nicht die Verwendung mit SELECT, INSERT, DELETE und UPDATE, da diese Werte zurückgeben. (Aber siehe diese Frage .)Werte einfügen
Beachten Sie, dass die
executeInsert()
Methode anstelle von verwendet wirdexecute()
. Natürlich möchten Sie nicht immer in jeder Zeile die gleichen Dinge eingeben. Dafür können Sie Bindungen verwenden .Normalerweise verwenden Sie vorbereitete Anweisungen, wenn Sie etwas (wie ein INSERT) schnell viele Male wiederholen möchten. Die vorbereitete Anweisung sorgt dafür, dass die SQL-Anweisung nicht jedes Mal analysiert und kompiliert werden muss. Mit Transaktionen können Sie die Dinge noch schneller machen . Dadurch können alle Änderungen gleichzeitig übernommen werden. Hier ist ein Beispiel:
Weitere Informationen zu Transaktionen und zur Beschleunigung von Datenbankeinfügungen finden Sie unter diesen Links.
Zeilen aktualisieren
Dies ist ein grundlegendes Beispiel. Sie können auch die Konzepte aus dem obigen Abschnitt anwenden.
Zeilen löschen
Die
executeUpdateDelete()
Methode kann auch für DELETE-Anweisungen verwendet werden und wurde in API 11 eingeführt. Siehe diese Fragen und Antworten .Hier ist ein Beispiel.
Abfrage
Normalerweise möchten Sie beim Ausführen einer Abfrage einen Cursor mit vielen Zeilen zurückerhalten. Dafür ist es aber nicht
SQLiteStatement
. Sie führen damit keine Abfrage aus, es sei denn, Sie benötigen nur ein einfaches Ergebnis, z. B. die Anzahl der Zeilen in der Datenbank, mit denen Sie arbeiten könnensimpleQueryForLong()
Normalerweise führen Sie die
query()
Methode SQLiteDatabase aus , um einen Cursor zu erhalten.In dieser Antwort finden Sie weitere Informationen zu Abfragen.
quelle
clearBindings()
setzt sie jedoch nicht nur aufnull
(siehe Quellcode ). Ich betrachte es als Löschen des Zustands, so dass nichts ihn von der vorherigen Schleife beeinflusst. Vielleicht ist das aber nicht nötig. Ich würde mich über jemanden freuen, der Kommentare abgeben kann.Wenn Sie bei der Rückkehr einen Cursor wünschen, können Sie Folgendes in Betracht ziehen:
Sehen Sie sich dieses Snippet Genscripts an, falls Sie ein vollständigeres wünschen. Beachten Sie, dass dies eine parametrisierte SQL-Abfrage ist, also im Wesentlichen eine vorbereitete Anweisung.
quelle
Jasonhudgins Beispiel wird nicht funktionieren. Sie können eine Abfrage nicht mit ausführen
stmt.execute()
und einen Wert (oder aCursor
) zurückerhalten.Sie können nur Anweisungen vorkompilieren, die entweder überhaupt keine Zeilen zurückgeben (z. B. eine Einfügung oder eine Tabellenanweisung erstellen) oder eine einzelne Zeile und Spalte (und
simpleQueryForLong()
oder verwendensimpleQueryForString()
).quelle
Um einen Cursor zu erhalten, können Sie kein compiledStatement verwenden. Wenn Sie jedoch eine vollständig vorbereitete SQL-Anweisung verwenden möchten, empfehle ich eine Anpassung der Methode von jbaez ... Verwenden von
db.rawQuery()
anstelle vondb.query()
.quelle