Ini adalah bagaimana saya memasukkan data ke dalam database menggunakan Room Persistence Library:
Kesatuan:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Objek akses data:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
Apakah mungkin untuk mengembalikan id Pengguna setelah penyisipan selesai dalam metode di atas sendiri tanpa menulis kueri pemilihan yang terpisah?
android
persistent-storage
android-room
SpiralDev
sumber
sumber
int
ataulong
bukannyavoid
sebagai hasil@Insert
operasi?aSyncTask
? bagaimana Anda mengembalikan nilai dari fungsi repositori Anda?Jawaban:
Berdasarkan dokumentasi di sini (di bawah cuplikan kode)
Metode yang dijelaskan dengan
@Insert
anotasi dapat mengembalikan:sumber
@Insert
fungsi dapat kembalivoid
,long
,long[]
atauList<Long>
. Silakan coba ini.sumber
return Single.fromCallable(() -> dbService.YourDao().insert(mObject));
Nilai balik dari penyisipan untuk satu catatan akan menjadi 1 jika pernyataan Anda berhasil.
Jika Anda ingin menyisipkan daftar objek, Anda dapat pergi dengan:
Dan jalankan dengan Rx2:
sumber
Dapatkan ID baris dengan sniplet berikut. Ini menggunakan callable pada ExecutorService with Future.
Ref: Tutorial Java Executor Service untuk informasi lebih lanjut tentang Callable.
sumber
Di Dao Anda, kueri insert mengembalikan
Long
yaitu rowId yang disisipkan.Di kelas Model (Repositori) Anda: (MVVM)
Di kelas ModelView Anda: (MVVM) Pegang LiveData dengan DisposableSingleObserver.
Referensi sumber kerja yang berfungsi: https://github.com/SupriyaNaveen/CookingRecipes
sumber
Setelah banyak perjuangan, saya berhasil menyelesaikan ini. Ini solusi saya menggunakan arsitektur MMVM:
Student.kt
StudentDao.kt
StudentRepository.kt
StudentViewModel.kt
Dalam Fragmen:
Saya telah menggunakan DataBinding. Berikut ini adalah XML saya:
Saya telah berjuang keras untuk mencapai hal ini dengan asynctask karena operasi memasukkan dan menghapus ruang harus dilakukan dalam utas terpisah. Akhirnya dapat melakukan ini dengan tipe tunggal yang dapat diamati di RxJava.
Inilah dependensi Gradle untuk rxjava:
sumber
Menurut fungsi dokumentasi yang dijelaskan dengan @Insert dapat mengembalikan rowId.
Masalah yang saya miliki dengan ini adalah bahwa ia mengembalikan rowId dan bukan id dan saya masih belum menemukan cara untuk mendapatkan id menggunakan rowId.
Sayangnya saya belum bisa berkomentar, karena saya tidak punya 50 reputasi, jadi saya memposting ini sebagai jawaban.
sumber