W moim nowym projekcie używam biblioteki trwałości pokoju systemu Android. Chcę zaktualizować niektóre pola tabeli. Próbowałem jak w moim Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
Ale kiedy próbuję zaktualizować za pomocą tej metody, aktualizuje ona każde pole jednostki, w której pasuje do wartości klucza podstawowego obiektu wycieczki. używałem@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Działa, ale w moim przypadku będzie wiele zapytań, ponieważ mam wiele pól w mojej encji. Chcę wiedzieć, jak mogę zaktualizować niektóre pola (nie wszystkie), na przykład Method 1
gdzie id = 1; (id to automatycznie generowany klucz podstawowy).
// Entity:
@Entity
public class Tour {
@PrimaryKey(autoGenerate = true)
public long id;
private String startAddress;
private String endAddress;
//constructor, getter and setter
}
android
sql-update
android-room
Rasel
źródło
źródło
Odpowiedzi:
Użyj
@Query
, tak jak w metodzie 2.Następnie miej mniejsze jednostki. Lub nie aktualizuj pól indywidualnie, ale zamiast tego wykonuj bardziej zgrubne interakcje z bazą danych.
IOW, w samym Pokoju nie ma nic, co zrobi to, czego szukasz.
źródło
@Query
.true =1
,false=0
SELECT * FROM note_table WHERE isNoteArchived == 0
Według dokumentacji aktualizacji SQLite :
Przykład:
Jednostka:
Dao:
źródło
Począwszy od pokoju 2.2.0 wydanego w październiku 2019 r., Można określić jednostkę docelową dla aktualizacji. Następnie, jeśli parametr aktualizacji jest inny, pomieszczenie zaktualizuje tylko kolumny części częściowej. Przykład pytania PO pokaże to nieco jaśniej.
Zauważ, że musisz utworzyć nową część częściową o nazwie TourUpdate, wraz z prawdziwym elementem Tour w pytaniu. Teraz, gdy wywołasz update z obiektem TourUpdate, zaktualizuje on endAddress i pozostawi tę samą wartość startAddress. Działa to idealnie dla mnie w moim przypadku zastosowania metody insertOrUpdate w moim DAO, która aktualizuje bazę danych nowymi zdalnymi wartościami z API, ale pozostawia dane lokalnej aplikacji w samej tabeli.
źródło
Możesz spróbować, ale wydajność może być trochę gorsza:
źródło
Myślę, że nie musisz aktualizować tylko określonego pola. Po prostu zaktualizuj całe dane.
W zasadzie jest to zadane zapytanie. Nie ma potrzeby wykonywania nowego zapytania.
Memo.class
Jedyne, co musisz wiedzieć, to „id”. Na przykład, jeśli chcesz zaktualizować tylko „tytuł”, możesz ponownie użyć „treści” i „zdjęcia” z już wstawionych danych. W prawdziwym kodzie użyj w ten sposób
źródło
Jeśli chcesz zaktualizować informacje o użytkowniku dla określonego identyfikatora użytkownika „x”,
ViewModel będzie zainicjować instancję dbManager dostępu do bazy danych. Kod powinien wyglądać następująco:
Następnie zaktualizuj swój element użytkownika w ten sposób, załóżmy, że twój identyfikator użytkownika to 1122, a nazwa użytkownika to „xyz”, który należy zmienić na „zyx”.
Uzyskaj obiekt userItem o identyfikatorze 1122 User
To jest surowy kod, mam nadzieję, że ci pomoże.
Miłego kodowania
źródło