Yanıtlar:
Bunu yapmak için bir DAO yöntemi oluşturabilirsiniz.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Querysonuç kümelerini döndüren şeylerle sınırlı olduğunu varsaydım (benzer rawQuery()). Çok havalı!
@Deleteparametre almayan ve tümünü tablodan silebilir miyim? Bunu dosyalamak için
Ids? Bunu beğendim ama Tablo Kimlikleri artmaya devam ediyor. Gerçek tablo düşüşünde ID'ler tekrar 0'dan başlamak üzere bırakılır.
Oda olarak clearAllTables ()1.1.0 kullanabilirsiniz :
Bu veritabanına varlık () olarak kaydedilmiş tüm tablolardaki tüm satırları siler.
SELECT name FROM sqlite_master WHERE type='table've sonra manuel olarak bir şey denemek isteyebilirsiniz DELETE FROM {TABLE}. Yine de bunu test etmedim.
Odadaki tablodan bir girişi silmek istiyorsanız, sadece bu işlevi çağırın,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Güncelleme: Tablonun tamamını silmek istiyorsanız aşağıdaki fonksiyonu çağırın,
@Query("DELETE FROM MyModel")
void delete();
Not: Burada MyModel bir Tablo Adıdır .
Önlemek için clearAllTables () öğesini aşağıdaki gibi RXJava ile kullanınjava.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());
}
});
Bu görevi arka planda yürütmek için RxJava kullanırken tüm yöntemi silmek ile ilgili sorunlar vardı . Sonunda şu şekilde çözdüm:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
ve
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}Kotlin'i kullanırken, RxJava ile fütür etmek yerine sadece sarın
Dick Lucas'ın söylediklerini birleştirerek ve diğer StackOverFlow yayınlarından bir sıfırlama otomatik eklemesi ekleyerek, bunun işe yarayabileceğini düşünüyorum:
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()
}
}
Açıklamayı kötüye @Querykullanmadan Odadan yararlanmak @Queryiçin önce tüm satırları seçmek ve bunları bir listeye koymak için kullanın , örneğin:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Listesini silme notuna koyun, örneğin:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
İşte bunu Kotlin'de yaptım.
DI (Koin) kullanarak aktivite db odasına enjekte edilir.
private val appDB: AppDB by inject()
Ardından clearAllTables () öğesini çağırabilirsiniz.
private fun clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, yanlış) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, yanlış)}}
clearAllTables()itibaren hangi "varlıkların () olarak bu veritabanına kayıtlı tüm tablolardan tüm satırları siler" kullanabilirsiniz . Bunu aşağıda bir cevap olarak ekledim, ancak burada görünürlük için yeniden üretiyorum.