Saya menggunakan rangka kerja bilik dalam projek Android Studio saya. Saya cuba membuat transaksi dalam antara muka. Saya telah membaca dokumentasi dari sini: https://developer.android.com/reference/androidx/room/Transaction
Saya tahu kita harus membuat transaksi dalam kelas abstrak dan bukannya antara muka. Saya hanya tertanya-tanya sama ada ini mungkin kerana saya sudah mempunyai lebih daripada sedozen antara muka dalam projek saya dan tidak mahu menulis semula mereka sebagai kelas abstrak.
Apa yang anda cuba lakukan tidak boleh dilakukan dalam antara muka kerana anda tidak boleh menggunakan kaedah dengan badan dalam antara muka.
Secara lebih khusus, anda cuba melaksanakan berbilang kenyataan (KEMASKINI, kemudian PADAM), tetapi hanya satu kenyataan boleh dilaksanakan pada masa yang sama.
Pilihan anda adalah untuk menentukan pencetus (dikemas kini jika baris berat boleh ditentukan dari dalam pencetus) atau mungkin lebih berkemungkinan menggunakan kelas abstrak dan dengan itu menggunakan fungsi untuk melaksanakan berbilang kenyataan atau menggunakan kaedah yang dieksploitasi (lulus/atau dapatkan semula )SupportSQliteDatabase (menggunakan kelas abstrak adalah lebih mudah).
Kemudian, untuk memanfaatkan urus niaga, anda akan mempunyai dummy @Query sebelum fungsi. Contohnya
Tambahan
Ini adalah demo yang berfungsi, direka untuk dijalankan sekali sahaja, ia menggunakan ketiga-tiga kaedah.
Pertama
@Entities
, berdasarkan apa yang tersedia dalam kod, tetapi sudah menggunakan panjang untuk mewakili tarikh (bukannya menggunakan penukar jenis).Lawati
Berat
@Dao
Kelas abstrak beranotasi dengan kaedah dan kaedah abstrak biasa dengan badan (Penyelesaian 1). Kaedah sisipan membenarkan memasukkan beberapa data (hanya satu baris).Kini,
@Database
kelas beranotasi (menggunakan bujang) sedikit lebih rumit.Ini mempunyai panggilan balik untuk menambah pencetus, pencetus adalah terlalu rumit kerana ia bukan sahaja memadamkan selepas kemas kini (tidak memadamkan apa-apa) tetapi juga menambah baris baharu dalam jadual akses yang menunjukkan bahawa TRIGGER sebenarnya sedang dicetuskan (penyelesaian 2) .
Selain itu, untuk alasan yang lebih baik (atau tidak bergantung pada gaya/latihan), sertakan fungsi untuk mendapatkan dan menggunakan SupportSQLiteDatabase (penyelesaian 3)
Untuk benar-benar menggunakan beberapa kod aktiviti di atasMainActivity
Hasil demo melalui SppInspection
Seperti dijangka meja berat kosong :-
Seperti yang dijangka, terdapat 4 baris dalam jadual akses:-
Akhir sekali, skema (iaitu sqlite_master) menunjukkan bahawa pencetus wujud (terpaksa menambah 3 baris tambahan):-