Подтвердить что ты не робот

Библиотека противого помещения. Удалить все

Как я могу удалить все записи в конкретной таблице с помощью библиотеки сохранения пространства? Мне нужно отбросить таблицу, но я не могу найти какую-либо информацию, как это сделать.

Только когда база данных переносится или загружает все записи и удаляет их:)

4b9b3361

Ответ 1

Вы можете создать метод DAO для этого.

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

Ответ 2

Начиная с комнаты 1.1.0 вы можете использовать clearAllTables(), которая:

Удаляет все строки из всех таблиц, которые зарегистрированы в этой базе данных как лица().

Ответ 3

Если вы хотите удалить запись из таблицы в комнате, просто вызовите эту функцию,

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

Обновление: и если вы хотите удалить полную таблицу, вызовите функцию ниже,

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

Примечание. Здесь MyModel - это имя таблицы.

Ответ 4

Используйте 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());


                }
            });

Ответ 5

Для Migration вы получите a SupportSQLiteDatabase и может удалить то, что вы хотите через execSQL().

Кроме того, вы можете вызвать getOpenHelper() на своем RoomDatabase и получить от него SupportSQLiteDatabase, снова набрав execSQL(), чтобы удалить то, что вы хотите.

Я не вижу способ удаления всех сущностей на основе аннотаций, если только у вас их все нет в памяти и может передать их методу @Delete -annotated на вашем Dao.

Ответ 6

Объединяя то, что говорит Дик Лукас, и добавляя автоинкремент сброса из других сообщений 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()
        }
    }

Ответ 7

У меня были проблемы с методом удаления всех при использовании 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)
}

Ответ 8

Чтобы использовать Комнату без злоупотребления аннотацией @Query сначала используйте @Query чтобы выделить все строки и поместить их в список, например:

@Query("SELECT * FROM your_class_table")

List'<'your_class'>' load_all_your_class();

Поместите его список в аннотацию удаления, например:

@Delete

void deleteAllOfYourTable(List'<'your_class'>' your_class_list);

Ответ 9

Я знал, что вы получили уже правильный ответ, но, чтобы работать с SQLite, вы также можете попробовать Kripton Persistence Library (теперь в версии 2.0.2), альтернативу Room. Kripton управляет сохранением SQLite, SharedPreference, REST-сервиса (с использованием Retrofit) и файловой системы.

С Kripton тот же код, показанный для библиотеки комнат, будет выглядеть следующим образом:

@BindDao(User.class) 
public interface MyDao {
    @BindSqlDelete
    public void nukeTable();
}

Я автор Криптона. Для получения дополнительной информации о библиотеке сохранения Криптона: