Odpowiedzi:
Aby to zrobić, możesz utworzyć metodę DAO.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
było to ograniczone do rzeczy, które zwracają zestawy wyników (podobne do rawQuery()
). Bardzo fajny!
@Delete
nie pobierał parametrów i usunąć wszystko z tabeli? Usiłuję znaleźć moduł śledzący Rooma, który go zarejestruje ...
Ids
? Podobało mi się to, ale identyfikatory tabeli nadal rosną. W prawdziwym upuszczaniu tabeli identyfikatory są również upuszczane, aby ponownie zacząć od zera.
Od Room 1.1.0
możesz używać clearAllTables (), które:
Usuwa wszystkie wiersze ze wszystkich tabel zarejestrowanych w tej bazie danych jako podmioty ().
SELECT name FROM sqlite_master WHERE type='table'
a następnie ręcznie DELETE FROM {TABLE}
. Nie przetestowałem tego jednak.
Jeśli chcesz usunąć wpis z tabeli w pokoju, po prostu wywołaj tę funkcję,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Aktualizacja: jeśli chcesz usunąć całą tabelę, wywołaj funkcję poniżej,
@Query("DELETE FROM MyModel")
void delete();
Uwaga: Tutaj MyModel jest nazwą tabeli.
Użyj clearAllTables () z RXJava, jak poniżej, aby uniknąćjava.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());
}
});
Miałem problemy z usunięciem wszystkich metod podczas korzystania z RxJava do wykonania tego zadania w tle. Oto jak w końcu to rozwiązałem:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
i
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
zamiast kupować za pomocą RxJava
Łącząc to, co mówi Dick Lucas i dodając reset autoincremental z innych postów StackOverFlow, myślę, że to może działać:
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()
}
}
Aby skorzystać z Pokoju bez nadużywania @Query
adnotacji, najpierw @Query
wybierz wszystkie wiersze i umieść je na liście, na przykład:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Umieść swoją listę w adnotacji usuwania, na przykład:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Oto jak to zrobiłem w Kotlinie.
Wstrzyknij db pokoju w aktywności za pomocą DI (Koin).
private val appDB: AppDB by inject()
Następnie możesz po prostu wywołać clearAllTables ()
prywatna zabawa clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO}}}
clearAllTables()
która „usuwa wszystkie wiersze ze wszystkich tabel zarejestrowanych w tej bazie danych jako encje ()”. Zamieściłem to jako odpowiedź poniżej, ale odtwarzam tutaj dla widoczności.