Firebase数据库 - 按ID列表查询

时间:2016-08-08 16:37:15

标签: android firebase-realtime-database

我最近开始将我的应用从Parse切换到Firebase。到目前为止,一切都很顺利,但我无法找到Firebase等效方法来解析其中whereContainedIn(String key,Collection values)。

这是一个非常有用的方法,它允许我传入一个id数组,它将返回匹配该id的所有行。到目前为止,使用Firebase,我让它返回数据库中的所有行,然后循环遍历它们以查看该行的id是否包含在我的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 个答案:

答案 0 :(得分:1)

制作另一个可以userId查找的引用,并让它返回该用户拥有的所有videoIds。从那里你可以查询视频。这意味着每次保存时,您需要保存两个位置。一种痛苦,但它是Firebase推荐的。

所以你的参考看起来更像是:

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