【问题标题】:Firebase database - Query by list of idsFirebase 数据库 - 按 id 列表查询
【发布时间】:2016-08-08 16:37:14
【问题描述】:

我最近开始将我的应用从 Parse 切换到 Firebase。到目前为止一切都很好,但我还没有找到与 Parse 的 whereContainedIn(String key, Collection values) 等效的 Firebase 方法。

这是一个非常有用的方法,它允许我传入一个 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");
    }
});

这些方法似乎都不合理,因为我的表将包含数十万条记录。

任何帮助将不胜感激!

【问题讨论】:

标签: android firebase-realtime-database


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但是否可以返回 Video 对象而不仅仅是 id?这仍然需要对每个视频进行单独的查询。我的目标是通过一次查询获取特定用户的所有视频对象。
  • 您可以将视频对象保存在两个位置。但最好只进行另一个查询。
  • 我认为这不能回答最初的问题?
【解决方案2】:

难道你不能在你的 id 上做一个 for 循环,并在 for 循环内编写一个 valueventlistener,它将为每个迭代的项目调用吗?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2017-11-24
  • 2019-07-28
相关资源
最近更新 更多