2016-08-08 162 views
4

我最近開始將我的應用從Parse切換到Firebase。到目前爲止,一切都很順利,但我一直無法找到Parse的whereContainedIn(String key,Collection values)的Firebase等效方法。Firebase數據庫 - 按ID列表查詢

這是一個非常有用的方法,它允許我傳入一個ID數組,它將返回與該ID相匹配的所有行。到目前爲止,我已經使用Firebase返回數據庫中的所有行,然後遍歷它們以查看該行的id是否包含在我的數組中。另一種方法是分別查詢每個ID,這對Firebase的異步行爲來說效果不佳。這是我現在要做的第一種方法:

List<String> userIds = new ArrayList<>(); 
userIds.add("2"); 
userIds.add("32"); 
userIds.add("12545"); 
userIds.add("187"); 

DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference(); 
Query queryRef = firebaseRef.child("videos"); 

queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     List<Video> usersVideos = new ArrayList<Video>(); 

     for (DataSnapshot videoSnapshot : dataSnapshot.getChildren()) { 
      Video video = videoSnapshot.getValue(Video.class); 

      if (userIds.contains(video.userId)) { 
       usersVideos.add(video); 
      } 
     } 

     // usersVideos is now populated with the videos for the users 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.d(TAG, "CANCELLED"); 
    } 
}); 

這些方法都不合理,因爲我的表格將包含數十萬條記錄。

任何幫助將不勝感激!

+1

火力地堡不具備'WHERE ID IN(1,2,3)'等價的。對於不需要的合理大小的列表,因爲Firebase管道請求。請參閱http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

回答

1

作出另一個參考,可以通過userId查找並返回該用戶擁有的所有videoIds。從那裏你可以查詢視頻。這意味着每次您節省您將需要保存在兩個位置。有點痛苦,但它是Firebase推薦的。

所以你參考看起來更像:

videos - 
     | - <videoId> - 
      | - <video stuffs> 
      | - userId 
videosByUser - 
     | - <userId> - 
        | 0 - <videoIdA> 
        | 1 - <videoIdB> 
     | - <userId2> - 
        | 0 - <videoIdA> 
+0

謝謝,但是否有可能返回Video對象而不僅僅是ID?這仍然需要爲每個視頻單獨查詢。我的目標是通過一個查詢獲取特定用戶的所有Video對象。 – Mark

+0

您可以在兩個地方保存視頻對象。但是再做一個查詢會更好。 –

+0

我不認爲這回答了原來的問題? – Atticus29