Risposte:
È possibile creare un metodo DAO per farlo.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
fosse limitato a cose che restituivano insiemi di risultati (affini a rawQuery()
). Molto bello!
@Delete
non accetta alcun parametro ed eliminare tutto dalla tabella? Sto cercando di trovare il tracker di Room per archiviare questo ...
Ids
? Mi è piaciuto, ma gli ID tabella continuano ad aumentare. Nella tabella reale drop anche gli id vengono rilasciati per ricominciare da 0.
A partire da Room 1.1.0
puoi usare clearAllTables () che:
Elimina tutte le righe da tutte le tabelle registrate in questo database come entità ().
SELECT name FROM sqlite_master WHERE type='table'
e poi manualmente DELETE FROM {TABLE}
. Non ho provato questo però.
Se desideri eliminare una voce dalla tabella in Room, chiama semplicemente questa funzione,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Aggiornamento: e se desideri eliminare la tabella completa, chiama la funzione di seguito,
@Query("DELETE FROM MyModel")
void delete();
Nota: qui MyModel è un nome tabella.
Utilizzare clearAllTables () con RXJava come inorder in basso per evitarejava.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());
}
});
Ho avuto problemi con l'eliminazione di tutti i metodi durante l'utilizzo di RxJava per eseguire questa attività in background. Ecco come l'ho finalmente risolto:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
e
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
invece di perdere tempo con RxJava
Combinando ciò che dice Dick Lucas e aggiungendo un reset automatico dagli altri post StackOverFlow, penso che possa funzionare:
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()
}
}
Per utilizzare la Stanza senza abuso @Query
dell'annotazione, utilizzare innanzitutto @Query
per selezionare tutte le righe e inserirle in un elenco, ad esempio:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Inserisci il suo elenco nell'annotazione di eliminazione, ad esempio:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Ecco come l'ho fatto a Kotlin.
Iniettare la stanza db nell'attività usando DI (Koin).
private val appDB: AppDB by inject()
Quindi puoi semplicemente chiamare clearAllTables ()
divertimento privato clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferenze.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferenze.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)}
clearAllTables()
quale "elimina tutte le righe da tutte le tabelle registrate in questo database come entità ()." Ho incluso questo come una risposta di seguito, ma sto riproducendo qui per la visibilità.