1

データベースを変更したときにルームデータベースを使用してコメントとRxJavaをリスナーとして保存しています。ルームデータベースの削除トリガーを削除する

insertが呼び出されたときにのみ、テーブルに対してdeleteが呼び出されたときにコールバックを呼び出さないようにしたいとします。私がこれまでに見つけた何

は、ルームライブラリが順番にRxJavaのメソッドを呼び出して、テーブルのdeleteinsertupdateで呼び出されtriggersを持っているということです。

deleteトリガーを削除し、insertおよびupdateメソッドのコールバックのみを削除する方法はありますか。ここで

は私CommentDAOです:

@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

あなただけなので、元のgetAll()Flowableをフィルタリングすることにより、欠失の挿入やないで発するFlowable<List<Comment>>を得ることができますそのうちのList<Comment>アイテムだけが、前のList<Comment>よりもCommentを含むものを通過することになります。

あなたは次の変換で、このフィルタリングを実装することができます。私たちは挿入のためのベースラインを持つように

  1. 前に付加空のリストと、流動性。
  2. RxJavawindow()サイズ2を取得して、隣接するアイテムを比較できるようにします。
  3. window()は、Flowable<Flowable<Comment>>を返します。それをFlowable<List<Comment>>に変換し、FlowableflatMap()toList()に変換します。
  4. 挿入を表す2要素ウィンドウをフィルタリングします(最初の要素のサイズは2番目の要素のサイズよりも小さくなります)。
  5. フィルタリングされたウィンドウの2番目の要素のみを出力します。 Kotlinで

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) 
} 
+0

これは、正しい応答がそう長く取るために残念です。ウィンドウ関数が挿入をどのようにフィルタリングするのかをもう少し説明してもらえますか? – Pavle37

関連する問題