2017-12-21 7 views
0

部屋で@Deleteアノテーションは何も放出しません。これはDAOは部屋で削除(rxjava)

@Dao 
public interface UserDao { 
    @Delete 
    void deleteUser(User user); 
    //We can't use Maybe or Single or anything here 

} 

userRepository.deleteUser()のような何かをしながら、これはそれ問題になるように見えるものである。subscribeOn当方は一切の発光がDAOを来ていない持っているので。次のコードを使用して、バックグラウンドスレッドでdeleteUserを呼び出します。

Observable.just(appDatabase). 
      subscribeOn(SchedulerProvider.getInstance().computation()). 

      subscribe(db -> { 
       userRepository.logoutUser(loggedUser.getLoggedInUser()); 
       loggedUser.setLoggedInUser(null); 


      }, this::handleError); 

これは問題なく動作します。しかし、subscribeメソッドでは、削除の成功を通知するトーストを表示するためにアンドロイドUIにアクセスする必要があります。 (observeOnがチェーンから欠落しているので)当然のことながら、私はこの

Observable.just(appDatabase). 
     subscribeOn(SchedulerProvider.getInstance().computation()). 
     observeOn(SchedulerProvider.getInstance().ui()). 
     subscribe(db -> { 
      userRepository.logoutUser(loggedUser.getLoggedInUser()); 
      loggedUser.setLoggedInUser(null); 

      Message message = new Message(R.string.user_logged_out_msg); 
      message.setMessageType(Message.MessageType.SUCCESS_MESSAGE); 
      view.showMessages(Arrays.asList(message)); //this leads to a taost 

     }, this::handleError); 

ようobserveOnを入れたときに、私は妙に

cannot access database on the main thread since it may potentially lock the ui for a long period of time 

何この例外を取得しかし

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

この例外を取得します地球上で?

+0

私はあなたのための決定的な答えを持っていませんが、私は、デフォルトではルームが明示的subscibeOn(呼び出す必要はありませんので、そのRXJavaは、バックグラウンドスレッドで呼び出しを行うと言うことができます)しかし、あなたは確認する必要がありますあなたがUIスレッドにアクティビティをプッシュするためにonを観察するよう呼び出すようにしてください。これは私があなたであれば私が見ている領域です。 –

+0

"私はバックグラウンドスレッドでdeleteUserを呼び出すために次のコードを使用します" - あなたは 'deleteUser()'を呼び出していません。一貫性を持たせるために例を同期させたいかもしれません。 – CommonsWare

答えて

0
@Query("DELETE FROM User.TABLE_NAME") 
public void nukeTable(); 

@Query("DELETE FROM " + User.TABLE_NAME + " WHERE " + User.COLUMN_ID + " = :id") 
int deleteById(long id); 

これらの方法は有用であり得る。

0

メソッドをに置き換えてください。

Observable.create(new ObservableOnSubscribe<Object>() { 
      @Override 
      public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Object> e) throws Exception { 
       e.onNext(tileDatabase.getCategoryDeo().deleteCategory(category)); 

      } 
     }) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<Object>() { 
        @Override 
        public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) { 
        } 

        @Override 
        public void onNext(@io.reactivex.annotations.NonNull Object o) { 
         Toast.makeText(MainActivity.this, "Record deleted ", Toast.LENGTH_SHORT).show(); 
        } 

        @Override 
        public void onError(@io.reactivex.annotations.NonNull Throwable e) { 
        } 

        @Override 
        public void onComplete() { 
        } 
       }); 
+0

これは妥当と思われます。私はこの瞬間を一瞬のうちに打ち明けます。 –

関連する問題