WedX - журнал о программировании и компьютерных науках

Удалить триггер удаления для базы данных Room

Я использую базу данных комнаты для хранения комментариев и RxJava в качестве слушателя, чтобы выполнять некоторые действия при изменении базы данных.

Я хочу не вызывать обратный вызов при вызове удаления в таблице, только при вызове вставки.

На данный момент я обнаружил, что в библиотеке Room есть triggers, которые вызываются для delete, insert и update таблицы, которые, в свою очередь, вызывают методы RxJava.

Есть ли способ удалить триггер delete и получить обратные вызовы только для методов insert и update?

Вот мой комментарийDAO:

@Query("SELECT * FROM comments" )
fun getAll(): Flowable<List<Comment>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(comment: Comment)

@Delete
fun delete(comment: Comment)

И мои функции обратного вызова RxJava:

 /**
 * Inserts comment into comment database
 * 
 * @param object that's going to be inserted to the database
 */
fun saveComment(comment: Comment) {
    Observable.just(comment).subscribeOn(Schedulers.io()).map({ comment1 -> commentdb.commentDao().insert(comment1) }).subscribe()
}

/**
 * Removes comment from the database
 *
 * @param comment object that's going to be removed
 */

fun removeComment(comment: Comment){
    Observable.just(comment).subscribeOn(Schedulers.io()).map({ comment1 -> commentdb.commentDao().delete(comment1) }).subscribe()
}

fun createCommentObservable(uploader: CommentUploader) {
    commentdb.commentDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(
            {
                success -> uploader.queue(success)
            }
    )
}

Ответы:


1

Вы можете получить Flowable<List<Comment>>, который выдается только при вставках, а не при удалении, отфильтровав исходные getAll() Flowable так, чтобы пропускались только те List<Comment> элементы, которые содержат больше Comment, чем предыдущие List<Comment>.

Вы можете реализовать эту фильтрацию с помощью следующих преобразований:

  1. Добавьте к потоку пустой список, чтобы у нас была база для вставок.
  2. Получите RxJava window()s размера 2, чтобы мы могли сравнивать соседние элементы.
  3. window() возвращает Flowable<Flowable<Comment>>. Преобразуйте его в Flowable<List<Comment>> с flatMap() и toList() на внутреннем Flowable.
  4. Отфильтровать те 2-элементные окна, которые представляют собой вставку (размер первого элемента меньше размера второго).
  5. Испускайте только 2-й элемент отфильтрованных окон.

В Котлине:

fun getAllAfterInsertions() {
    getAll()
            .startWith(emptyList<String>())                        // (1)
            .window(2, 1)                                          // (2)
            .flatMap({ w -> w.toList().toFlowable() })             // (3)
            .filter({ w -> w.size == 2 && w[0].size < w[1].size }) // (4)
            .map({ window -> window[1] })                          // (5)
}
10.12.2017
  • Это правильно, извините, что так долго не отвечаю. Не могли бы вы объяснить немного больше, как оконная функция отфильтровывает вставки? 27.12.2017

  • 2

    Чтобы удалить без уведомления, я просто заменяю

    MyDao().delete()

    с одним выполнением @Query

    MyDao().deleteLast()

    тогда w Flowable не генерирует новое событие. @Dao выглядит так

    @Dao
    abstract class MyDao : BaseDao<Data> {
    
       @Query("DELETE FROM Data WHERE id = (select min(id) from Data)") // or something else
       abstract fun deleteLast()
    
       @Delete
       fun delete(data: Data)
    
    }
    
    29.08.2018
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]