Comment puis-je supprimer toutes les entrées d'une table spécifique à l'aide de Room Persistence Library? J'ai besoin de quitter la table, mais je ne trouve aucune information sur la manière de procéder.
Seulement lorsque la base de données est en cours de migration ou pour charger toutes les entrées et les supprimer :)
Vous pouvez créer une méthode DAO pour cela.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
À partir de Room 1.1.0
, vous pouvez utiliser clearAllTables () qui:
Supprime toutes les lignes de toutes les tables enregistrées dans cette base de données en tant qu'entités ().
Si vous souhaitez supprimer une entrée de la table dans Room, appelez simplement cette fonction,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Mise à jour: Et si vous voulez supprimer le tableau complet, appelez la fonction ci-dessous,
@Query("DELETE FROM MyModel")
void delete();
Remarque: Ici MyModel est un nom de table.
Utilisez clearAllTables () avec RXJava comme ci-dessous afin d'éviter 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());
}
});
En combinant ce que Dick Lucas et en ajoutant une réinitialisation automatique à partir d'autres publications StackOverFlow, je pense que cela peut fonctionner:
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()
}
}
J'ai eu des problèmes avec delete all method lors de l'utilisation de RxJava pour exécuter cette tâche en arrière-plan. Voici comment j'ai finalement résolu le problème:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
et
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
Pour utiliser la salle sans abuser de l'annotation @Query
, utilisez d'abord @Query
pour sélectionner toutes les lignes et les mettre dans une liste, par exemple:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Mettez sa liste dans l'annotation de suppression, par exemple:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);