sockeqwe / sqlbrite-dao

DAO for SQLBrite
http://hannesdorfmann.com/android/sqlbrite-dao
Apache License 2.0
182 stars 22 forks source link

The onCompeleted method has never been called. #47

Closed hiyjeain closed 7 years ago

hiyjeain commented 7 years ago

The onCompeleted method in Subscriber has never been called after I query a set of data with the DAO. The code is following.

       employeeDao
                .getAllEmployee()
                .subscribe(new Subscriber<List<Employee>>() {
                    @Override
                    public void onCompleted() {
                        Log.d("DEBUG", "----- Completed -----");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("ERROR", e.getMessage());
                    }

                    @Override
                    public void onNext(List<Employee> employees) {
                        for (Employee employee : employees) {
                            Log.v("VERBOSE", employee.getDepartment());
                        }
                    }
                });

The problem is, No complete signal is not friendly if I want to do some transformation. For example I queried a set of data, and I want map each item in set and regenerate a set.

       employeeDao
                .getEmployee()
                .flatMap(Observable::from)
                .map(employee -> new Person(employee))
                .toList()
                .subscribe(new Subscriber<List<Person>>() {
                    @Override
                    public void onCompleted() {
                        Log.d("DEBUG", "----- Completed -----");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("ERROR", e.getMessage());
                    }

                    @Override
                    public void onNext(List<Person> persons) {
                        for (Person person : persons) {
                            Log.v("VERBOSE", person.getName());
                        }
                    }
                });

But even the onNext will not be called this time for the dao never send the Complete signal. The toList op wait for the compelete signal forever.

I'm not sure this is a Sqlbrite Bug(or Feature?) or Sqlbrite-dao one.

hiyjeain commented 7 years ago

I found this issue in the sqlbrite issue list. https://github.com/square/sqlbrite/issues/127 A take() op is just work fine.

employeeDao
                .getEmployee().take(1)....