如何知道在firebase DB中添加了哪个新条目?

时间:2017-09-19 11:59:59

标签: android firebase firebase-realtime-database firebase-authentication firebase-storage

我的应用分为两个部分,用户和管理员。管理员可以在firebase db / node中添加/删除新项目,并将其反映到用户应用程序中。请注意,用户应用程序始终处于打开状态,并使用以下代码更新列表。

    mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            arrayList.clear();

            for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
                for (DataSnapshot snapshot : dataSnapshotChild.getChildren()) {
                    Log.v("onDataChange", ":" + snapshot.getValue());
                    Model model = new Model();
                    model.setReceivedServiceCategory(dataSnapshotChild.getKey());
                    model.setKey(snapshot.getKey());
                    model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
                    model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
                    model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
                    arrayList.add(model);
                }
            }
            loadDataToRecyclerView();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.v("DatabaseError", databaseError.getMessage());
        }
    });

我的问题,我想在firebase db / node中显示弹出的新添加的条目。现在,我可以看到更新的列表,但同时我想突出显示最新添加的条目。另外,我不想比较旧的&最新列表,请提供解决方案,除了比较2个列表,如果firebase提供任何其他合适的方式?

2 个答案:

答案 0 :(得分:1)

您可能希望从数据库中获取有关更新数据的更详细信息。在这种情况下,您应该使用ChildEventListener类。鉴于您的树中有两个单独的分支,您将要为每个品牌使用单独的ChildEventListener

这导致两个听众,每个都有onChildAddedonChildChanged等方法。但每种方法都很简单。

第一个片段:

mFirebaseDatabase.getChild("user").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        Log.v("onChildAdded", ":" + snapshot.getKey() + " " + snapshot.getValue());
        Model model = new Model();
        // TODO: model.setReceivedServiceCategory(dataSnapshotChild.getKey());
        model.setKey(snapshot.getKey());
        model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
        model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
        model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
        arrayList.add(model);
    }
    public void onChildRemoved(DataSnapshot snapshot) {
        // TODO: remove the item with snapshot.getKey() from the array list
    }
    ...

});

答案 1 :(得分:0)

复制@Frank van解决方案的一种方法是首先使用你的监听器

 mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        arrayList.clear();

        for (DataSnapshot dataSnapshotChild : dataSnapshot.getChildren()) {
            for (DataSnapshot snapshot : dataSnapshotChild.getChildren()) {
                Log.v("onDataChange", ":" + snapshot.getValue());
                Model model = new Model();
                model.setReceivedServiceCategory(dataSnapshotChild.getKey());
                model.setKey(snapshot.getKey());
                model.setReceivedFrom((String) snapshot.child("xxxxx").getValue());
                model.setRaisedAtTimings((String) snapshot.child("xxxxx").getValue());
                model.setReceivedStatus((String) snapshot.child("xxxx").getValue());
                arrayList.add(model);
            }
        }
        loadDataToRecyclerView();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.v("DatabaseError", databaseError.getMessage());
    }
});

一次检索所有数据并在回收视图中显示它们,然后取消注册您的监听器并添加一个新的ChildEventListener,Firebase将发送它的下一个节点将是最后一个条目。

通过这种解决方案,逻辑变得有点混乱。另一种解决方案是在firebase模型中添加日期字段,从firebase检索所有数据并将它们存储在TreeMap结构中,您可以使用Comparator根据日期对数据进行排序。然后,您将从最后一个条目到第一个条目排序所有数据。从那里,您可以将代码写入您的Recycler View适配器,以便以不同于其他行的方式处理第一行(例如,突出显示第一行)。