2011-11-02 12 views
30

Potrzebuję wykonać procedurę INSERT lub UPDATE IF EXIST z moją bazą danych. Czytałem, że droga do celu była .replace(). Wstawia nowe rekordy dobrze, ale jeśli rekord już istnieje, nie wydaje się go aktualizować.Android SQLite - co właściwie robi SQLiteDatabase.replace()?

mam coś takiego:

ContentValues values = new ContentValues(); 
values.put(ID, 1); 
values.put(NAME, "bob"); 
values.put(VISIBLE, true); 
db.replace("peopleTable", null, values); 

Jeśli uruchomić ten kod, kiedy nie jest to rekord w bazie danych, wydaje się, aby utworzyć rekord dobrze, jakbym zrobił insert(). Ale jeśli zmienię NAME na "john" lub coś podobnego i ponownie uruchomę replace(), to nie wydaje się, aby aktualizować rekord.

Zgodnie z docs, tutaj jest składnia:

public long replace (String table, String nullColumnHack, ContentValues initialValues) 

Dlaczego nazywa initalValues? Czy to oznacza, że ​​te wartości są używane tylko wtedy, gdy rekord nie istnieje i zostanie wstawiony? Jeśli tak, jak użyć tej metody do aktualizacji rekordu? Gdzie określasz nowe wartości?

Jeśli nie rozumiem, co robi replace(), czy ktoś może wyjaśnić, jaki jest cel?

+1

Czyni włożyć lub wymienić. –

+2

Możesz użyć procedur 'INSERT' i' REPLACE' w swoich metodach 'ContentProvider.insert()', jeśli przekażesz specjalny parametr do 'ContentValues'. Napisałem o tym wpis na blogu: [SQLite INSERT OR REPLACE przez ContentProvider | Buzzing Android] (http://www.buzzingandroid.com/2013/01/sqlite-insert-or-replace-through-contentprovider/) – JesperB

Odpowiedz

29

Jak rozumiem, replace() działa podobnie jak słowo SQLite REPLACE - wiersz zostanie zaktualizowany, jeśli wystąpi wyjątkowe naruszenie ograniczenia dla wstawki. Tak więc kolumna ID w twoim przykładzie musiałaby mieć ograniczenie klucza PRIMARY w schemacie bazy danych, aby wiersz był aktualizowany.

+0

Myślę, że to może być problem. –

+0

Po pierwsze, tak, pole "_id" jest KLUCZEM PODSTAWOWYM. Po drugie, nowe rekordy nie są tworzone. Oznacza to, że metoda faktycznie znajduje oryginalny rekord i nie tworzy nowego. Ale tak jak powiedziałem, istniejąca płyta po prostu nie jest aktualizowana ... –

+2

Tak, cytując @ blogu JesperB - "Jak widać w oficjalnej dokumentacji (SQL W rozumieniu SQLite), polecenie wykonuje INSERT LUB REPLACE, czyli wykonaj INSERT, a jeśli INSERT nie powiedzie się z powodu konfliktu, usuń sprzeczne wiersze przed INSERTing ponownie. " –

3

Metoda replace() faktycznie wykonać polecenie sql insert or replace into (...) values (...)

Powiązane problemy