Відповіді:
Для цього можна створити метод DAO.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
це обмежено речами, які повертають набори результатів (подібні до rawQuery()
). Дуже круто!
@Delete
не має жодного параметра та видалити все з таблиці? Я намагаюся знайти трекер Кімнати, щоб подати це ...
Ids
? Мені це подобалося, але ідентифікатори таблиці продовжують збільшуватися. У реальній крапці таблиці знижуються ідентифікатори, щоб знову почати з 0.
Станом на номер 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 () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)
clearAllTables()
який "видаляє всі рядки з усіх таблиць, які зареєстровані в цій базі даних як об'єкти ()." Я включив це як відповідь нижче, але відтворюю тут для наочності.