2015-08-31 14 views
6

का उपयोग करने के लिए कौन सा ऑपरेटर मैंने SqlBrite के साथ संयोजन में आरएक्सजेवा का उपयोग शुरू किया और मुझे zip ऑपरेटर के साथ कुछ समस्याएं हैं।आरएक्सजेवा और एसक्लब्रेट -

मान लें कि मेरे पास 2 कक्षाएं, User और Tweet हैं।

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 डीएओ

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(); 
    } 

} 

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 ऑपरेटरों के संयोजन का उपयोग प्रत्येक User के लिए Tweet की सूची को पॉप्युलेट करने का प्रयास किया।

पहला प्रश्न: क्या ऐसा करने का एक बेहतर तरीका है?

दूसरा प्रश्न: कि zip ऑपरेटर और हमेशा के लिए लटका करने लगता है कभी नहीं पूरा करता है ... मुझे लगता है कि tweetDao.getTweetsByUser(user) कहा जाता है लेकिन zip की Func कभी नहीं कहा जाता है ... किसी को भी एक विचार क्यों है?

तीसरा सवाल: वहाँ flatMap और from के संयोजन का उपयोग की तुलना में एक Observable<T> अन्य के लिए एक Observable<List<T>> बदलने का एक बेहतर तरीका है?

अरे, कि RxJava शक्तिशाली है, लेकिन सीखने की अवस्था बहुत खड़ी है ...

उत्तर

4

क्यों नहीं करते हैं डेटाबेस में शामिल होने संभाल?

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

आप कुछ स्तंभ नाम बदलने के लिए अगर दो तालिकाओं इस नाम के कॉलम है हो सकता है।

here

+0

में शामिल होने के बारे में मुझे लगता है कि यह भी काम कर सकता है। मुझे प्रति उपयोगकर्ता –

+0

@LordRaydenMk को प्रत्येक ट्वीट पंक्ति को समूहित करना होगा, अगर यह एक जटिल एसक्यूएल था और वह wrapContentProvider विधि का उपयोग कर रहा था? –

संबंधित मुद्दे