首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxJava和Sqlbrite -使用什么运算符

RxJava和Sqlbrite -使用什么运算符
EN

Stack Overflow用户
提问于 2015-08-31 18:11:20
回答 1查看 2.3K关注 0票数 6

我开始结合使用RxJava和SqlBrite,并且与zip操作符有一些问题。

假设我有两个类,UserTweet

代码语言:javascript
复制
public class User {
    public long id;
    public List<Tweet> users;
    ...
}

public class Tweet {
    public long id;
    public User poster;
    ...
}

以及它们各自的SQLite表:

代码语言:javascript
复制
user
---------
id INTEGER PRIMARY KEY

tweet
---------
id INTEGER PRIMARY KEY
poster_id INTEGER
FOREIGN KEY(poster_id) REFERENCES user(id)

以及各自的SqlBrite DAO

UserDao:

代码语言:javascript
复制
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;
                    }
                })
                // transform Observable<List<User>> into Observable<User>
                .flatMap(new Func1<List<User>, Observable<User>>() {
                    @Override
                    public Observable<User> call(List<User> users) {
                        return Observable.from(users);
                    }
                });

        // combine each user with his tweets
        return Observable.zip(usersObs, usersObs.flatMap(new Func1<User, Observable<List<Tweet>>>() {
            @Override
            public Observable<List<Tweet>> call(User user) {
                return tweetDao.getTweetsByUser(user);
            }
        }), new Func2<User, List<Tweet>, User>() {
            @Override
            public User call(User user, List<Tweet> tweets) {
                user.tweets = tweets;
                return user;
            }
        }).toList();
    }

}

TweetDAO:

代码语言:javascript
复制
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;
                    }
                })
    }
}

正如您在UserDao中看到的,我尝试使用zipflatMap运算符的组合来填充每个UserTweet列表。

第一个问题:有没有更好的方法来做到这一点?

第二个问题:zip操作符似乎永远挂着,永远不会完成.我看到tweetDao.getTweetsByUser(user)被称为,但Func of zip却从未被称为.有谁知道原因吗?

第三个问题:与使用Observable<List<T>>from的组合相比,是否有更好的方法将Observable<T>转换为flatMap

该死,RxJava很强大,但是学习曲线很陡峭.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 20:02:46

为什么不让数据库来处理连接呢?

代码语言:javascript
复制
SELECT * FROM user INNER JOIN tweet ON user._id = tweet.poster_id

如果两个表的列名称相同,则可能必须重命名某些列。

关于联接这里的更多信息

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32317333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档