Jawaban:
Anda dapat membuat metode DAO untuk melakukan ini.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Queryitu terbatas pada hal-hal yang mengembalikan set hasil (mirip dengan rawQuery()). Sangat keren!
@Deletetidak memiliki parameter dan menghapus semua dari tabel? Saya mencoba mencari pelacak Kamar untuk mengarsipkan itu ...
Ids? Saya memang suka ini tetapi Id Tabel terus bertambah. Dalam tabel drop nyata Id juga turun mulai dari 0 lagi.
Pada Kamar 1.1.0Anda dapat menggunakan clearAllTables () yang:
Menghapus semua baris dari semua tabel yang terdaftar ke database ini sebagai entitas ().
SELECT name FROM sqlite_master WHERE type='table'dan kemudian secara manual DELETE FROM {TABLE}. Belum diuji ini.
Jika ingin menghapus entri dari tabel di Kamar cukup panggil fungsi ini,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Pembaruan: Dan jika Anda ingin menghapus tabel lengkap, panggil fungsi di bawah ini,
@Query("DELETE FROM MyModel")
void delete();
Catatan: Di sini MyModel adalah Nama Tabel.
Gunakan clearAllTables () dengan RXJava seperti di bawah ini untuk menghindarijava.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
getRoomDatabase().clearAllTables();
}
}).subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(new Action() {
@Override
public void run() throws Exception {
Log.d(TAG, "--- clearAllTables(): run() ---");
getInteractor().setUserAsLoggedOut();
getMvpView().openLoginActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d(TAG, "--- clearAllTables(): accept(Throwable throwable) ----");
Log.d(TAG, "throwable.getMessage(): "+throwable.getMessage());
}
});
Saya memiliki masalah dengan menghapus semua metode saat menggunakan RxJava untuk menjalankan tugas ini di latar belakang. Beginilah akhirnya saya menyelesaikannya:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
dan
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}menggunakan RxJava
Menggabungkan apa yang dikatakan Dick Lucas dan menambahkan reset autoincremental dari postingan StackOverFlow lainnya, saya pikir ini bisa bekerja:
fun clearAndResetAllTables(): Boolean {
val db = db ?: return false
// reset all auto-incrementalValues
val query = SimpleSQLiteQuery("DELETE FROM sqlite_sequence")
db.beginTransaction()
return try {
db.clearAllTables()
db.query(query)
db.setTransactionSuccessful()
true
} catch (e: Exception){
false
} finally {
db.endTransaction()
}
}
Untuk menggunakan Kamar tanpa penyalahgunaan @Queryanotasi, gunakan dulu @Queryuntuk memilih semua baris dan memasukkannya ke dalam daftar, misalnya:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Masukkan daftarnya ke dalam anotasi penghapusan, misalnya:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Inilah cara saya melakukannya di Kotlin.
Suntikkan room db dalam aktivitas menggunakan DI (Koin).
private val appDB: AppDB by inject()
Maka Anda cukup memanggil clearAllTables ()
private fun clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferensi.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferensi.put (PreferensiConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false}}
clearAllTables()yang "menghapus semua baris dari semua tabel yang terdaftar ke database ini sebagai entitas ()." Saya memasukkan ini sebagai jawaban di bawah, tetapi saya mereproduksi di sini untuk visibilitas.