【问题标题】:Firebase Realtime Database addChildEventListener fetch all items when app reopenFirebase 实时数据库 addChildEventListener 在应用重新打开时获取所有项目
【发布时间】:2018-01-01 19:03:17
【问题描述】:

addValueEventListener 会在数据库中发生更改时提供所有数据,因此我已实现 addChildEventListener 以在数据库中有新内容时获取唯一的新项目。

目前,我面临的问题是每当我打开应用程序时,addChildEventListeneronChildAdded 方法中一一获取所有项目。

有什么方法可以只获取 Firebase 实时数据库中的新项目?这是我的代码:

                mDatabase.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    News news = dataSnapshot.getValue(News.class);
                    Log.i("YES-onChildAdded", news.getId()+"/"+news.getHeadline());
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                    News news = dataSnapshot.getValue(News.class);
                    Log.i("YES-onChildChanged", news.getId()+"/"+news.getHeadline());
                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                    News news = dataSnapshot.getValue(News.class);
                    Log.i("YES-onChildRemoved", news.getId()+"/"+news.getHeadline());
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                    News news = dataSnapshot.getValue(News.class);
                    Log.i("YES-onChildMoved", news.getId()+"/"+news.getHeadline());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.i("YES-Cancelled", databaseError.getMessage());
                }
            });

【问题讨论】:

  • 任何侦听器都会在您附加它时立即检索它指向的所有数据,然后在侦听器保持附加时进行任何更改。没有办法改变这种行为。如果您想要“仅新”数据,则必须定义“新”的含义。例如。如果它是某个时间戳之后的数据,则在查询中包含该时间戳。另请参阅我刚才在这里留下的评论中的链接:stackoverflow.com/questions/48049476/…

标签: android firebase firebase-realtime-database


【解决方案1】:

当您在特定的DatabaseReference 上附加侦听器时,这意味着侦听器将从引用指向的位置检索所有数据。因为 Firebase 数据库不存储元数据,您需要自己为每条记录添加 TIMESTAMP。定义某个数据,然后您可以创建一个查询来相应地过滤您的数据库。不幸的是,这是在 Fireabse 中无法更改的行为。

假设您有一个名为 item 的节点,并且该节点中的每个项目都正确设置了 TIMESTAMP,使用 TIMESTAMP 查询数据库的代码应如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("item").orderByChild("timestamp");

您还可以使用以下限制查询您的数据库:

Query query = rootRef.child("item")
     .orderByChild("timestamp")
     .startAt(startingTime)
     .endAt(endingTime);

【讨论】:

  • 你能告诉我查询是怎样的吗?因为我看不到任何可以使用时间戳过滤数据的方法?
  • 您的回答解决了我的问题,但目前,它还获取时间为“startingTime”的项目,但这已经在本地数据库中,我们可以在“startingTime”之后获取结果吗?
  • 您可以使用增加您的startingTime,以仅获取所需的值,startingTime + numberYouNeed。如果您说我的回答对您有帮助,请考虑接受并投票。谢谢!
  • 您在单个 SO 问题中节省了我的几个小时 2 次。为你竖起大拇指。
  • 您的回答解决了我的问题,但产生了一个新问题。现在onChildChanged 在旧项目被修改时不要撤销。有什么我们可以做的吗?
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2020-09-14
相关资源
最近更新 更多