Ответы:
Вы можете создать метод DAO для этого.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
было ограничено вещами, которые возвращают наборы результатов (сродни rawQuery()
). Очень круто!
@Delete
принимает параметров и удалить все из таблицы? Я пытаюсь найти трекер комнаты, чтобы
Ids
? Мне это понравилось, но идентификаторы таблиц продолжают увеличиваться. В реальной таблице идентификаторы сброса также сбрасываются, чтобы начать с 0 снова.
Начиная с Room 1.1.0
вы можете использовать clearAllTables (), которая:
Удаляет все строки из всех таблиц, которые зарегистрированы в этой базе данных как лица ().
SELECT name FROM sqlite_master WHERE type='table'
а затем вручную DELETE FROM {TABLE}
. Хотя не проверял это.
Если вы хотите удалить запись из таблицы в комнате, просто вызовите эту функцию,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Обновление: и если вы хотите удалить полную таблицу, вызовите функцию ниже,
@Query("DELETE FROM MyModel")
void delete();
Примечание. Здесь MyModel - это имя таблицы.
Используйте clearAllTables () с RXJava, как показано ниже, чтобы избежать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());
}
});
У меня были проблемы с методом удаления всех при использовании RxJava для выполнения этой задачи в фоновом режиме. Вот как я наконец решил это:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
и
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
вместо того, чтобы возиться с RxJava
Объединяя то, что говорит Дик Лукас, и добавляя автоинкремент сброса из других сообщений StackOverFlow, я думаю, что это может сработать:
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()
}
}
Чтобы использовать Комнату без злоупотребления @Query
аннотацией, сначала @Query
выберите все строки и поместите их в список, например:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Поместите его список в аннотацию удаления, например:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Вот как я это сделал в Котлине.
Введите номер db в упражнении, используя DI (Koin).
private val appDB: AppDB by inject()
Тогда вы можете просто вызвать clearAllTables ()
личное развлечение clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () Предпочтения.
clearAllTables()
команду «удаляет все строки из всех таблиц, которые зарегистрированы в этой базе данных как лица ()». Я включил это как ответ ниже, но я воспроизвожу здесь для наглядности.