Saya menggunakan pustaka persistensi ruang android untuk proyek baru saya. Saya ingin memperbarui beberapa bidang tabel. Saya telah mencoba seperti di Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
Tetapi ketika saya mencoba memperbarui menggunakan metode ini maka itu memperbarui setiap bidang entitas yang cocok dengan nilai kunci utama objek wisata. Saya telah menggunakan@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Ini berfungsi tetapi akan ada banyak pertanyaan dalam kasus saya karena saya memiliki banyak bidang di entitas saya. Saya ingin tahu bagaimana saya dapat memperbarui beberapa bidang (tidak semua) seperti di Method 1
mana id = 1; (id adalah kunci utama yang dihasilkan secara otomatis).
// 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
sumber
sumber
Jawaban:
Gunakan
@Query
, seperti yang Anda lakukan di Metode 2.Kemudian miliki entitas yang lebih kecil. Atau, jangan perbarui kolom satu per satu, tetapi miliki interaksi yang lebih kasar dengan database.
IOW, tidak ada apa pun di Room itu sendiri yang akan melakukan apa yang Anda cari.
sumber
@Query
.true =1
,false=0
SELECT * FROM note_table WHERE isNoteArchived == 0
Menurut SQLite Update Docs :
Contoh:
Kesatuan:
Dao:
sumber
Mulai Room 2.2.0 yang dirilis Oktober 2019, Anda dapat menentukan Entitas Target untuk pembaruan. Kemudian jika parameter pembaruan berbeda, Ruangan hanya akan memperbarui kolom entitas parsial. Contoh pertanyaan OP akan menunjukkan ini sedikit lebih jelas.
Perhatikan bahwa Anda harus membuat entitas parsial baru yang disebut TourUpdate, bersama dengan entitas Tur asli Anda dalam pertanyaan tersebut. Sekarang ketika Anda memanggil update dengan objek TourUpdate, itu akan memperbarui endAddress dan membiarkan nilai startAddress sama. Ini berfungsi sempurna bagi saya untuk kasus penggunaan metode insertOrUpdate di DAO saya yang memperbarui DB dengan nilai jarak jauh baru dari API tetapi membiarkan data aplikasi lokal di tabel saja.
sumber
Anda dapat mencoba ini, tetapi kinerjanya mungkin sedikit lebih buruk:
sumber
Saya pikir Anda tidak perlu memperbarui hanya beberapa bidang tertentu. Perbarui seluruh data.
Ini pada dasarnya adalah kueri yang diberikan. Tidak perlu membuat kueri baru.
Memo.class
Satu-satunya hal yang perlu Anda ketahui adalah 'id'. Misalnya, jika Anda hanya ingin memperbarui 'judul', Anda dapat menggunakan kembali 'konten' dan 'foto' dari data yang sudah dimasukkan. Dalam kode sebenarnya, gunakan seperti ini
sumber
Jika Anda perlu memperbarui informasi pengguna untuk ID pengguna tertentu "x",
The ViewModel akan menginisialisasi sebuah instance dari DBManager untuk mengakses database. Kode tersebut akan terlihat seperti ini:
Kemudian perbarui item pengguna Anda dengan cara ini, misalkan ID pengguna Anda 1122 dan nama pengguna adalah "xyz" yang harus diubah menjadi "zyx".
Dapatkan userItem dari id 1122 User object
Ini adalah kode mentah, semoga dapat membantu Anda.
Selamat membuat kode
sumber