Firebase实时数据库addChildEventListener在应用重新打开时获取所有项目

时间:2018-01-01 19:03:18

标签: android firebase firebase-realtime-database

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

目前,我遇到的问题是每当我打开应用时,addChildEventListener都会在onChildAdded方法中逐个获取所有项目。

有什么办法可以只在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());
                }
            });

1 个答案:

答案 0 :(得分:2)

当您在特定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);