2012-11-13 12 views
6

Używam skompilowany SQLiteStatement z transakcji w optymalizacji transakcji SQLite ale czytam w dokumentacji funkcji execute:SQLiteStatement wykonać SELECT/INSERT/DELETE/UPDATE

wykonać to SQL, jeśli nie jest to SELECT/INSERT/DELETE/UPDATE, na przykład CREATE/DROP tabela, widok, spust, indeksów itp

to zdaje się sugerować, że ta funkcja nie powinna być używana z SELECT/INSERT/DELETE/UPDATE sprawozdania, ale Mam kod, który używa go z insertem i działa.

Jestem świadomy executeInsert i innych metod, ale executeUpdateDelete nie jest dostępny na moim poziomie interfejsu API, więc czy mogę użyć execute?

Również jeśli nie potrzebuję ostatniego identyfikatora wkładki lub liczby uszkodzonych wierszy, czy powinienem używać execute zamiast executeInsert itd., Innymi słowy czy jest bardziej wydajny?

Odpowiedz

3

execute prawdopodobnie nie szybciej niż executeInsert, może być nawet wolniej (na ICS execute nazywa executeUpdateDelete i odrzuca wartości zwracanej). Musisz to sprawdzić, ale wątpię, czy znajdziesz tu naprawdę dużą różnicę.

AFAIK, Bezpiecznie jest używać tylko execute, jeśli nie potrzebujesz wartości zwracanych, ale nie liczę na to, że będą prawdziwe w przyszłych wersjach Androida. Dokumentacja mówi "nie", więc może ktoś zmieni to zachowanie, aby to odzwierciedlić. Starsze implementacje wydają się również używać execute (na przykład 2.1 delete() sourcecode). Jelly Bean na przykład zmienił a lot kulisy SQLite, ale powinna nadal działać podczas korzystania execute

Poza tym, jeśli nie w kółko używać tego samego SQLiteStatement gdy tylko ponownego wiązania args to chyba nie warto go używać . Budowanie nowego za każdym razem, gdy wywołujesz zwykłe metody insert, update, ... jest szybkie w porównaniu do rzeczywistego dostępu do bazy danych i wymaganego dysku I/O. Transakcje z drugiej strony bardzo dużo pomagają, ponieważ synchronizacja stanu bazy danych na dysku dla każdej instrukcji jest bardzo powolna.

+0

Oznacza to, że nie ma gwarancji, że 'execute()' zadziała w przyszłości również z instrukcją 'INSERT statement' również dokumenty są po prostu mylące powiedzą' Wykonaj instrukcję SQL, jeśli nie jest to SELECT/INSERT/.... "wtedy nie powinno się wykonywać' INSERT' (ponieważ jest to tylko testowany test) i działa! I dziękuję za cenne informacje :) –

+0

Również 'statement.executeUpdateDelete();' to dostępne w API 11 jakieś obejście dla 2.2? –

+1

@MuhammadBabar Dokumentacja próbuje powiedzieć, że metoda 'execute' nie jest przeznaczona dla instrukcji, które mają wynik. Podobnie jak zestaw wierszy dla zaznaczenia, liczba zmian dla aktualizacji/usunięcia lub ostatniego wiersza id dla wstawienia. Jak dotąd nie ma kodu, który uniemożliwiałby działanie tych niezamierzonych instrukcji. Może, nie wiem, przyszłe zmiany w architekturze bazy danych.Inżynierowie z Androidem mogą łatwo dodać taką zmianę bez powiadomienia, ponieważ opis metody ostrzega, że ​​nie będzie działać od lat. – zapl

1

Użyj SQLiteDatabase zamiast SQLiteStatement do interakcji z twoją bazą danych. SQLiteStatements nie są bezpieczne dla wątków, więc nie użyłbym ich do SELECT/INSERT/DELETE/UPDATE. Powinieneś także nie używać surowych zapytań do bazy danych do niczego innego niż Selects. Są wbudowane funkcje pomocnicze, które zwiększą wydajność bazy danych. Na swoim wystąpieniu SQLiteDatabase masz .insert, .update, .delete i używam .rawQuery dla Selects.

+0

ale nie jest "BEZBARWNA" oznacza tylko * wielowątkową * aplikację. W przypadku pojedynczego wątku warto go użyć, jeśli chcesz wstawić luzem. –

+0

um, każda aplikacja z DB powinna być wielowątkowa. Wszelkie żądania dotyczące dysku, bazy danych lub usługi WWW powinny być wyłączone z wątku interfejsu użytkownika. Jeśli blokujesz wątek interfejsu użytkownika, aby wstawiać zbiorcze wstawki, robisz to źle. – JustinMorris

+0

Cóż, mówiłem o wątkach innych niż Main. –