2017-07-17 120 views
0

我在數據庫,課程和講座中有2個表。他們是1:N的關係。我的問題是我想刪除多個課程,在此之前我必須確保所有相關講座都被刪除,以及一些文件和講座一起。也就是說,我要刪除多個當然,對於每門課程,下面的步驟應該執行:RxJava + Android + GreenDao:級聯刪除多個實體

  1. 刪除講座文件和記錄的刪除過程
  2. 刪除過程

如何使用做RxJava 1.x?謝謝。

回答

0

我認爲這將是這樣的:

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

如果您使用GreenDao,我不認爲以這種方式使用RxJava是你最好的選擇。您的主要問題在於您沒有進行交易,這會讓您面臨數據以不一致狀態結束的風險。儘管可以考慮一個很好的練習,「我怎樣才能用Rx風格編寫這段代碼?」我建議在這個過程的每一步中,都不會給你帶來任何好處。因此,我建議您在GreenDao事務中將您的刪除代碼編寫爲程序性(而非Rx)代碼,並且僅在完成時才使用RxJava進行通知。當你在一個GreenDao事務處理塊中時,其內部的所有數據庫調用都是按照保證順序一個接一個地同步進行的。

此外,爲了獲得最大的一致性,我只會在事務塊被提交後立即刪除所有文件(因爲如果部分數據庫事務失敗並且數據庫不能刪除文件, t更新)。另外,在GreenDao中有兩種主要的刪除方法:直接,session.delete(entity)和查詢,query.buildDelete().tableDeleteQuery.executeDeleteWithoutDetachingEntities()。直接刪除代碼要簡單得多,但如果您有大量數據,速度可能會變慢。如果你有不到1000個非常簡單的實體,直接刪除可能足夠好。 因此,您的代碼可能如下所示:

final DaoSession daoSession = getDaoSession(); 
final List<Course> courses = getCoursesToDelete(); 
// rxTx() creates a tx that runs on RxJava's 'io' scheduler. 
daoSession.rxTx().call(() -> { 
    List<File> filesToDelete = new ArrayList<>(); 
    for(Course course : courses) { 
     for(Lecture lecture : course.getLectures()) { 
      filesToDelete.add(lecture.getFiles()); 
      daoSession.delete(lecture); 
     } 
     daoSession.delete(course); 
    } 
    return filesToDelete; 
}) 
// potentially handle DB errors here 
// .flatMapIterable here if you want each File as an Rx event 
.doOnNext(filesToDelete -> { 
    for(File f : filesToDelete) { 
     // Throw on failed delete here if needed 
     f.delete(); 
    } 
}) 
// handle file delete errors if desired. 
.subscribeOn(Schedulers.io()) // technically redundant 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe();