I started using RxJava in combination with SqlBrite and I am having some problems with the zip operator.
Let's say I have 2 classes, User and Tweet .
public class User { public long id; public List<Tweet> users; ... } public class Tweet { public long id; public User poster; ... }
And their respective SQLite tables:
user --------- id INTEGER PRIMARY KEY tweet --------- id INTEGER PRIMARY KEY poster_id INTEGER FOREIGN KEY(poster_id) REFERENCES user(id)
and their corresponding SqlBrite DAO
UserDao:
public class UserDao { private final BriteDatabase briteDb; private final TweetDAO tweetDao; ... public Observable<List<User>> getUsersWithTheirTweets() { Observable<User> usersObs = briteDb.createQuery("user", "SELECT * FROM user") .map(new Func1<SqlBrite.Query, List<User>>() { @Override public List<User> call(SqlBrite.Query query) { Cursor cursor = query.run(); List<User> result = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { User user = UserTable.parseCursor(cursor); result.add(user); } cursor.close(); return result; } })
TweetDAO:
public class TweetDAO { private final BriteDatabase briteDb; ... public Observable<List<Tweet>> getTweetsForUser(final User user) { briteDb.createQuery("tweet", "SELECT * FROM tweet WHERE poster_id = ?", Long.toString(user.id)) .map(new Func1<SqlBrite.Query, List<User>>() { @Override public List<Tweet> call(SqlBrite.Query query) { Cursor cursor = query.run(); List<Tweet> result = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { Tweet tweet = TweetTable.parseCursor(cursor); tweet.user = user; result.add(tweet); } cursor.close(); return result; } }) } }
As you can see in UserDao , I tried using a combination of zip and flatMap to populate the Tweet list for each User .
First question: is there a better way to do this?
Second question: the zip operator seems to hang forever and never ends ... I see that tweetDao.getTweetsByUser(user) is called, but Func zip never called ... Does anyone have an idea why?
Third question: is there a better way to convert an Observable<List<T>> to an Observable<T> other than using a combination of flatMap and from ?
Damn that RxJava is powerful, but the learning curve is pretty steep ...