Yanıtlar:
Bunu yapmak için bir DAO yöntemi oluşturabilirsiniz.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
sonuç kümelerini döndüren şeylerle sınırlı olduğunu varsaydım (benzer rawQuery()
). Çok havalı!
@Delete
parametre 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 @Query
kullanmadan Odadan yararlanmak @Query
iç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.