Sim*_*ani 6 java android rx-java sqlbrite
我开始将RxJava与SqlBrite结合使用,我遇到了zip运算符的一些问题.
假设我有2个课程,User并且Tweet.
public class User {
public long id;
public List<Tweet> users;
...
}
public class Tweet {
public long id;
public User poster;
...
}
Run Code Online (Sandbox Code Playgroud)
和他们各自的SQLite表:
user
---------
id INTEGER PRIMARY KEY
tweet
---------
id INTEGER PRIMARY KEY
poster_id INTEGER
FOREIGN KEY(poster_id) REFERENCES user(id)
Run Code Online (Sandbox Code Playgroud)
和他们各自的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;
}
})
// 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();
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的UserDao,我尝试使用zip和flatMap运算符的组合来填充Tweet每个列表User.
第一个问题:有更好的方法吗?
第二个问题:即zip运营商似乎永远挂永不结束......我看到,tweetDao.getTweetsByUser(user)被称为但Func的zip永远不会被调用......有没有人有一个想法,为什么?
第三个问题:是否有一种更好的方法可以将一个Observable<List<T>>转换为Observable<T>另一个而不是使用flatMap和from?的组合?
该死的,RxJava功能强大,但学习曲线非常陡峭......
为什么不让数据库处理连接?
SELECT * FROM user INNER JOIN tweet ON user._id = tweet.poster_id
Run Code Online (Sandbox Code Playgroud)
如果两个表具有相同名称的列,您可能必须重命名某些列。
有关加入的更多信息请参见此处
| 归档时间: |
|
| 查看次数: |
2221 次 |
| 最近记录: |