¿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 🙂
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 arawQuery()
). ¡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
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 manualmenteDELETE FROM {TABLE}
. Sin embargo, no he probado esto.– Alexei
27 de febrero de 2019 a las 8:10
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(this@emptyDatabase).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
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
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