【问题标题】:How to get in order data from two different children in Firebase Realtime Database?如何从 Firebase 实时数据库中的两个不同子项获取订单数据?
【发布时间】:2021-06-22 02:15:26
【问题描述】:

我有两张模特的照片和视频。要检索照片,我调用 addChildEventListener 并获取视频,我调用另一个 addChildEventListener 添加。

代码示例

databaseReference = FirebaseDatabase.getInstance().getReference("videos");
    Query queryContent= databaseReference;
    queryContent.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            videos v= dataSnapshot.getValue(videos.class);
            objectItems.add(v);

            loading = true;

            contentViewPager.setAdapter(new discover_fullscreen_adapter(getApplicationContext(), objectItems));
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

照片也是一样,只是换了参考,还有型号

databaseReference = FirebaseDatabase.getInstance().getReference("photos");
photos p = dataSnapshot.getValue(photos.class);
                objectItems.add(p)

首先我添加视频,然后添加照片,顺序很混乱,因为我想按照拍摄顺序将视频和照片放在一起。 就像一个电话库我们按拍摄方式订购了照片和视频(在他的情况下是时间戳)。知道照片和视频位于不同的节点并且由不同的模型调用,我怎样才能达到同样的效果? 如何使用 Firebase 实时数据库来做到这一点

我的模型基于 getter 和 setter,我不想让问题变得更大。

谢谢

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    我想按拍摄顺序将视频和照片放在一起。就像一个电话画廊。

    您只能在单个节点上执行 Firebase 实时数据库查询。您无法使用 Query 跨多个节点获取数据。如果您想一次性获取“照片”和“视频”,那么两者都应该存在于同一个节点中。因此,您应该创建另一个名为“photosAndVideos”的节点,您应该在其中添加所有数据。这种做法称为非规范化,是 Firebase 的常见做法。为了更好地理解,我建议您观看此视频,Denormalization is normal with the Firebase Database

    一旦您在单个节点下拥有所有数据,您就可以根据时间戳执行所需的查询。请从以下帖子中查看我的答案:

    查看如何将时间戳属性添加到您的对象。默认情况下,Firebase 按升序排列结果。但是,如果您需要降序,请参阅我在以下帖子中的回答:

    编辑:

    您必须从结果中检查每个对象是哪个类的实例。因此,当您读取数据时,您不能只转换值。您必须读取每个对象并在调用 getValue() 时请求正确的类。

    【讨论】:

    • 谢谢你的回答。但我还有一个问题。当我调用 childEventListener 查询视频的子时间戳时,我只会将视频添加到我的列表中,然后添加照片。所以在所有照片之后都会看到照片。它不会按假定的顺序呈现。
    • 不,只要你查询的是一个单个节点,并且每张照片和视频都有不同的时间戳,结果会按照那个时间戳属性排序。跨度>
    • 是的,但要查询我需要添加照片 p= dataSnapshot.getValue(Photos.class);和视频 v= dataSnapshot.getValue(Videos.class);在同一个 onChildAdded
    • 请查看我更新的答案。现在可以了吗?
    • 您还可以从post 中查看 Frank van Puffelen 的关于多态文档的回答。它适用于 Cloud Firestore,但也适用于实时数据库。您可以在单个节点中存储不同类型的对象。
    猜你喜欢
    • 2020-12-01
    • 2021-01-25
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多