2017-07-17 20 views
0

データベース、コース、講義の2つのテーブルがあります。それらは1:Nの関係です。私の問題は、複数のコースを削除したいということです。その前に、関連する講義がすべて削除されていることと、講義とともにいくつかのファイルが削除されていることを確認する必要があります。それは私が複数のコースを削除したい、である、すべてのコースには、次の手順を実行する必要があります。RxJava + Android + GreenDao:複数のエンティティをカスケードで削除する

  1. 削除講義ファイルとレコードが
  2. コースを削除すると、それを行うにはどのよう

コースを削除しますRxJava 1.x?ありがとう。

答えて

0

私はそれはようなものだと思う:あなたはGreenDaoを使用している場合

ArrayList<Course> courses = new ArrayList<>(); 
    Observable.fromIterable(courses) 
      .doAfterNext(new Consumer<Course>() { 
       @Override 
       public void accept(Course course) throws Exception { 
        //DELETE this Course 
       } 
      }).flatMap(new Function<Course, ObservableSource<ArrayList<Lecture>>>() { 
       @Override 
       public ObservableSource<ArrayList<Lecture>> apply(Course course) throws Exception { 
        return Observable.fromArray(course.getAllLecture()); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Consumer<ArrayList<Lecture>>() { 
       @Override 
       public void accept(ArrayList<Lecture> lectures) throws Exception { 
        //delete all lectures 
       } 
      }); 
+0

Thx、doAfterNext?それはdoOnNextかdoAfterTerminateですか?私はrxjava 1.xを使用しています – liang

+0

DoAfterNextはonNextの後に実行されます(ここでは講義を削除しています)。 – lomg

0

、私はこの方法でRxJavaを使用することが最善の策であるとは思いません。あなたの主な問題は、あなたがトランザクションに参加していないことで、データが矛盾した状態になる危険があります。 「このコードをRxスタイルで書くにはどうしたらよいですか?私は、このプロセスのあらゆる段階でそれを使用することはあなたに何も得られないことを提案します。したがって、私はGreenDaoトランザクションの内部に手続き型(Rxではなく)コードを記述し、RxJavaを使用して完了したときに通知することをお勧めします。 GreenDaoトランザクションブロックの内部にいる場合、その内部のすべてのデータベース呼び出しは、保証された順序で次々に同期して行われます。

さらに、一貫性を最大限にするために、トランザクションブロックがコミットされた後でのみ、すべてのファイルを一度に削除します(DBトランザクションの一部が失敗し、データベースが失敗した場合、 t更新)。さらに、GreenDaoで削除を実行する主な方法は、直接、session.delete(entity)とクエリquery.buildDelete().tableDeleteQuery.executeDeleteWithoutDetachingEntities()の2つです。直接削除はコード作成がはるかに簡単ですが、膨大な量のデータがある場合は遅くなる可能性があります。 1000個未満の非常に単純なエンティティがある場合は、直接削除で十分でしょう。 したがって、コードは次のようになります。

関連する問題