web-dev-qa-db-fra.com

Bibliothèque de persistance des salles. Supprimer tout

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 :)

136
Sirelon

Vous pouvez créer une méthode DAO pour cela.

@Dao 
interface MyDao {
    @Query("DELETE FROM myTableName")
    public void nukeTable();
}
344
yigit

À 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 ().

76
Dick Lucas

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.

19

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());


                }
            });
7
Adewale Balogun

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()
        }
    }
1
Hamlet Leon

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)
}
1
Micer

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);
0
Dirk Fraanje