删除Room数据库的删除触发器

时间:2017-12-07 16:20:10

标签: android kotlin android-room rx-android android-architecture-components

我正在使用会议室数据库来存储评论,并使用RxJava作为监听器,在数据库发生变化时做一些事情。

我想在表上调用delete时不调用回调,只有在调用insert时才会调用。

我到目前为止发现的是,房间图书馆的triggersdeleteinsertupdate调用,后者又称为RxJava&#39 ;方法。

有没有办法放弃delete触发器并仅针对insertupdate方法获得回调?

这是我的评论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)
            }
    )
}

2 个答案:

答案 0 :(得分:1)

您可以通过过滤原始Flowable<List<Comment>> getAll()来获取仅在插入而非删除时发出的Flowable,以便只传递包含List<Comment>项的Comment项比之前的List<Comment>更多RxJava

您可以使用以下转换实现此过滤:

  1. 使用空列表添加flowable,以便我们有插入的基线。
  2. 获取大小为2的window() window(),以便我们能够比较相邻的项目。
  3. Flowable<Flowable<Comment>>返回Flowable<List<Comment>>。将内容flatMap()上的toList()Flowable转换为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) }
  4. 过滤那些代表插入的2元素窗口(第一个元素的大小小于第二个元素的大小)。
  5. 仅发出已过滤窗口的第二个元素。
  6. 在Kotlin:

    return redirect('vendors')->with('vendor',$allvendors);
    

答案 1 :(得分:0)

要删除而没有通知,我只需替换

MyDao().delete()

其中一个执行@Query

MyDao().deleteLast()

然后,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)

}