2017-07-17 113 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();