Ответ 1
Вы можете создать метод DAO для этого.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
Как я могу удалить все записи в конкретной таблице с помощью библиотеки сохранения пространства? Мне нужно отбросить таблицу, но я не могу найти какую-либо информацию, как это сделать.
Только когда база данных переносится или загружает все записи и удаляет их:)
Вы можете создать метод DAO для этого.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
Начиная с комнаты 1.1.0
вы можете использовать clearAllTables(), которая:
Удаляет все строки из всех таблиц, которые зарегистрированы в этой базе данных как лица().
Если вы хотите удалить запись из таблицы в комнате, просто вызовите эту функцию,
@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());
}
});
Для Migration
вы получите a SupportSQLiteDatabase
и может удалить то, что вы хотите через execSQL()
.
Кроме того, вы можете вызвать getOpenHelper()
на своем RoomDatabase
и получить от него SupportSQLiteDatabase
, снова набрав execSQL()
, чтобы удалить то, что вы хотите.
Я не вижу способ удаления всех сущностей на основе аннотаций, если только у вас их все нет в памяти и может передать их методу @Delete
-annotated на вашем Dao
.
Объединяя то, что говорит Дик Лукас, и добавляя автоинкремент сброса из других сообщений 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()
}
}
У меня были проблемы с методом удаления всех при использовании 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)
}
Чтобы использовать Комнату без злоупотребления аннотацией @Query
сначала используйте @Query
чтобы выделить все строки и поместить их в список, например:
@Query("SELECT * FROM your_class_table")
List'<'your_class'>' load_all_your_class();
Поместите его список в аннотацию удаления, например:
@Delete
void deleteAllOfYourTable(List'<'your_class'>' your_class_list);
Я знал, что вы получили уже правильный ответ, но, чтобы работать с SQLite, вы также можете попробовать Kripton Persistence Library (теперь в версии 2.0.2), альтернативу Room. Kripton управляет сохранением SQLite, SharedPreference, REST-сервиса (с использованием Retrofit) и файловой системы.
С Kripton тот же код, показанный для библиотеки комнат, будет выглядеть следующим образом:
@BindDao(User.class)
public interface MyDao {
@BindSqlDelete
public void nukeTable();
}
Я автор Криптона. Для получения дополнительной информации о библиотеке сохранения Криптона: