gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:03:46 24 4
gpt4 key购买 nike

我开始结合使用 RxJava 和 SqlBrite我在使用 zip 时遇到了一些问题运营商。

假设我有 2 个类,UserTweet .

public class User {
public long id;
public List<Tweet> users;
...
}

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

以及它们各自的 SQLite 表:

user
---------
id INTEGER PRIMARY KEY

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

和它们各自的 SqlBrite DAO

用户道:

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:

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 中看到的那样,我尝试使用 zip 的组合和 flatMap运算符填充 Tweet 的列表对于每个 User .

第一个问题:有更好的方法吗?

第二个问题:那个zip运算符似乎永远挂起并且永远不会完成......我看到了tweetDao.getTweetsByUser(user)被调用但是 Funczip从未被调用...有人知道为什么吗?

第三个问题:有没有更好的方法来转换Observable<List<T>>Observable<T>除了使用 flatMap 的组合和 from

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

最佳答案

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

SELECT * FROM user INNER JOIN tweet ON user._id = tweet.poster_id

如果两个表中有同名的列,您可能需要重命名某些列。

关于联接的更多信息 here

关于java - RxJava 和 Sqlbrite - 使用什么运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com