2016-08-08 114 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