Biblioteca de persistencia de salas. Eliminar todos

6 minutos de lectura

¿Cómo puedo eliminar todas las entradas en una tabla específica usando la biblioteca de persistencia de salas? Necesito soltar la tabla, pero no puedo encontrar ninguna información sobre cómo hacerlo.

Solo cuando la base de datos está migrando o para cargar todas las entradas y eliminarlas 🙂

  • A partir de Room 1.1.0 puedes usar clearAllTables() que “elimina todas las filas de todas las tablas que están registradas en esta base de datos como entidades ()”. He incluido esto como una respuesta a continuación, pero lo reproduzco aquí para mayor visibilidad.

    – Dick Lucas

    12 abr 2018 a las 15:42

  • Porque varias personas parecen estar sugiriendo clearAllTables()no puedo evitar señalar que OP dice claramente “¿Cómo puedo eliminar todas las entradas en una tabla específica”.

    -Chucky

    28 de marzo a las 15:52

Puede crear un método DAO para hacer esto.

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

  • Ah, no había pensado en eso. lo asumo @Query estaba limitado a cosas que devuelven conjuntos de resultados (similares a rawQuery()). ¡Muy genial!

    – CommonsWare

    29 mayo 2017 a las 20:08


  • @yigit puedo pedir eso @Delete no toma ningún parámetro y elimina todo de la tabla? Estoy tratando de encontrar el rastreador de Room para archivar eso…

    –Felipe Duarte

    5 de junio de 2017 a las 21:44

  • ¡Cuidado! en cuanto a la versión room alpha4, esta técnica conducirá a un error de compilación de gradle: tematracker.google.com/issues/63608092

    – yshahak

    13 de julio de 2017 a las 5:45

  • Qué tal si Ids? Me gustó esto, pero los identificadores de tabla continúan aumentando. En la tabla real, los ID de caída también se eliminan para comenzar desde 0 nuevamente.

    – Ioane Sharvadze

    18 de julio de 2017 a las 8:18


  • @yigit ¿Hay alguna forma de saber si la consulta se ejecutó correctamente o si hubo un error?

    – Aditya Ladwa

    19 de septiembre de 2017 a las 6:27

avatar de usuario
dick lucas

A partir de la habitación 1.1.0 puedes usar borrarTodasTablas() cual:

Elimina todas las filas de todas las tablas que están registradas en esta base de datos como entidades ().

  • Tenga cuidado: clearAllTables() es asíncrono y no hay forma de saber cuándo se completa.

    – Alexei

    10 de julio de 2018 a las 15:14

  • @Alexey, pero ¿podría haber algún problema al tratar de guardar algo después de borrar todas las tablas? Como en, ¿solo intentará insertar DESPUÉS de borrar? Porque estoy bien con eso.

    – El primero

    31 de agosto de 2018 a las 14:27


  • @FirstOne clearAllTables básicamente solo inicia una transacción en un nuevo subproceso de fondo. Elimina todos los datos de las tablas y luego confirma esa transacción. Si inicia su transacción más tarde de lo que comienza clearAllTables, está bien. Dicho esto, si intenta insertar algunos datos justo después de llamar a clearAllTable, su inserción podría comenzar antes de que clearAllTable inicie la transacción y perderá todos sus datos. Si necesita insertar nuevos datos justo después de llamar a clearAllTable, al menos agregue algo de retraso.

    – Alexei

    31 de agosto de 2018 a las 15:39


  • @Alexey ¿Hay alguna forma de usar un método de devolución de llamada o similar para determinar el estado de la transacción de eliminación? En otras palabras, si el estado de transacción de eliminación está completo, continúe con el método de inserción de datos.

    – AJW

    26 de febrero de 2019 a las 19:14

  • @AJW No, a partir de ahora, todavía no hay forma de saber cuándo se completó la operación. Si realmente necesita esta funcionalidad, es posible que desee probar algo como SELECT name FROM sqlite_master WHERE type='table' y luego manualmente DELETE FROM {TABLE}. Sin embargo, no he probado esto.

    – Alexei

    27 de febrero de 2019 a las 8:10

avatar de usuario
Aman Gupta – ΔMΔN

Si desea eliminar una entrada de la tabla en Room simplemente llame a esta función,

@Dao
public interface myDao{
    @Delete
    void delete(MyModel model);
}

Actualizar: Y si desea eliminar la tabla completa, llame a la función a continuación,

  @Query("DELETE FROM MyModel")
  void delete();

Nota: Aquí Mi modelo es un nombre de tabla.

  • Recibí este error después de usar su error de código de actualización: un método DAO abstracto debe anotarse con una y solo una de las siguientes anotaciones: Insertar, Eliminar, Consulta, Actualizar, RawQuery void delete ();

    – bramastaVic

    16 de noviembre de 2019 a las 7:30

Usar borrarTodasTablas() con RXJava como a continuación para evitar 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());


                }
            });

Tuve problemas con eliminar todo el método al usar RxJava para ejecutar esta tarea en segundo plano. Así es como finalmente lo resolví:

@Dao
interface UserDao {
    @Query("DELETE FROM User")
    fun deleteAll()
}

y

fun deleteAllUsers() {
    return Maybe.fromAction(userDao::deleteAll)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe ({
            d("database rows cleared: $it")
        }, {
            e(it)
        }).addTo(compositeDisposable)
}

  • Cuando usa Kotlin, puede envolverlo en thread {} en lugar de futzing con RxJava

    – Erik

    20 dic 2018 a las 20:01

Así lo hacemos desde un Fragmento.

fun Fragment.emptyDatabase() {
    viewLifecycleOwner.lifecycleScope.launchWhenCreated {
        withContext(Dispatchers.IO) {
            Database.getInstance(requireActivity()).clearAllTables()
        }
    }
}

Si está vaciando la base de datos de una actividad, use esto:

fun Activity.emptyDatabase() {
    // create a scope to access the database from a thread other than the main thread
    val scope = CoroutineScope(Dispatchers.Default)
    scope.launch {
        SitukaDatabase.getInstance([email protected]).clearAllTables()
    }
}

También podría ser posible llamar al clearAllTables método del hilo principal. No lo probé, pero noté que Android Studio no reconoce la llamada como una función de suspensión.

  • Cuando usa Kotlin, puede envolverlo en thread {} en lugar de futzing con RxJava

    – Erik

    20 dic 2018 a las 20:01

avatar de usuario
gary chen

Combinando lo que dice Dick Lucas y agregando un reinicio autoincremental de otras publicaciones de StackOverFlow, creo que esto puede funcionar:

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

  • Por lo que vale, he encontrado que es más fácil hacer esto a través de context.deleteDatabase(“nombre”) y luego simplemente reiniciando y poblando la base de datos a través de Room.databaseBuilder().addCallback en el primer acceso.

    – Bink

    22 oct 2018 a las 22:40

  • ¿Qué es sqlite_sequence?

    – Royal Griffin

    15 de abril de 2020 a las 12:51

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad