Jawaban:
Anda dapat membuat metode DAO untuk melakukan ini.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
itu terbatas pada hal-hal yang mengembalikan set hasil (mirip dengan rawQuery()
). Sangat keren!
@Delete
tidak 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.0
Anda 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 @Query
anotasi, gunakan dulu @Query
untuk 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.