Jak korzystać z przygotowanych wyciągów w SQlite w Androidzie?
android
sqlite
prepared-statement
pupeno
źródło
źródło
Odpowiedzi:
Cały czas korzystam z przygotowanych wyciągów w Androidzie, to dość proste:
źródło
SQLiteStatement.bindXXX()
indeks ma wartość 1, a nie 0, jak większość z nich.Dla przygotowanych instrukcji SQLite w systemie Android jest SQLiteStatement . Przygotowane instrukcje pomagają przyspieszyć działanie (szczególnie w przypadku instrukcji, które muszą być wykonywane wielokrotnie), a także pomagają uniknąć ataków polegających na iniekcji. Zobacz ten artykuł, aby zapoznać się z ogólną dyskusją na temat przygotowanych wypowiedzi.
SQLiteStatement
jest przeznaczony do użytku z instrukcjami SQL, które nie zwracają wielu wartości. (Oznacza to, że nie użyjesz ich do większości zapytań). Poniżej znajduje się kilka przykładów:Utwórz tabelę
execute()
Sposób nie zwraca wartość tak, że jest odpowiedni do użycia z tworzenia i usuwania, lecz nie są przeznaczone do stosowania z wybranych przez użytkownika, Wstawianie, usuwanie i UPDATE, ponieważ obie te wartości. (Ale spójrz na to pytanie .)Wstaw wartości
Zwróć uwagę, że
executeInsert()
metoda jest używana zamiastexecute()
. Oczywiście nie chciałbyś zawsze wpisywać te same rzeczy w każdym wierszu. Do tego możesz użyć wiązań .Zwykle używasz przygotowanych instrukcji, gdy chcesz szybko coś powtórzyć (np. INSERT) wiele razy. Przygotowana instrukcja sprawia, że instrukcja SQL nie musi być za każdym razem analizowana i kompilowana. Możesz jeszcze bardziej przyspieszyć, korzystając z transakcji . Pozwala to na jednoczesne zastosowanie wszystkich zmian. Oto przykład:
Sprawdź te linki, aby uzyskać więcej przydatnych informacji na temat transakcji i przyspieszenia wstawiania do bazy danych.
Zaktualizuj wiersze
To jest podstawowy przykład. Możesz również zastosować koncepcje z powyższej sekcji.
Usuń wiersze
Ta
executeUpdateDelete()
metoda może być również używana do instrukcji DELETE i została wprowadzona w API 11. Zobacz to pytanie i odpowiedź .Oto przykład.
Pytanie
Zwykle po uruchomieniu zapytania chcesz odzyskać kursor z wieloma wierszami.
SQLiteStatement
Jednak nie do tego służy. Nie uruchamiasz z nim zapytania, chyba że potrzebujesz tylko prostego wyniku, takiego jak liczba wierszy w bazie danych, którą możesz zrobićsimpleQueryForLong()
Zwykle
query()
w celu uzyskania kursora uruchomisz metodę SQLiteDatabase .Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje na temat zapytań.
źródło
clearBindings()
nie tylko ustawia je nanull
(zobacz kod źródłowy ). Patrzę na to jako oczyszczanie stanu, dzięki czemu nic nie wpływa na niego z poprzedniej pętli. Może to jednak nie jest konieczne. Byłbym zadowolony, gdyby ktoś wiedział, że może to skomentować.Jeśli chcesz mieć kursor po powrocie, możesz rozważyć coś takiego:
Zobacz ten fragment Genscripts na wypadek, gdybyś chciał mieć pełniejszy. Zauważ, że jest to sparametryzowane zapytanie SQL, więc w zasadzie jest to przygotowana instrukcja.
źródło
Przykład jasonhudgins nie zadziała. Nie można wykonać zapytania zi
stmt.execute()
odzyskać wartość (lub aCursor
).Możesz prekompilować tylko instrukcje, które albo nie zwracają żadnych wierszy (takich jak instrukcja wstawiania lub tworzenia tabeli), albo pojedynczy wiersz i kolumnę (i użyj
simpleQueryForLong()
lubsimpleQueryForString()
).źródło
Aby uzyskać kursor, nie możesz użyć compiledStatement. Jeśli jednak chcesz skorzystać z w pełni przygotowanej instrukcji SQL, polecam adaptację metody jbaez ... Używanie
db.rawQuery()
zamiastdb.query()
.źródło