繁体   English   中英

Firebase:Firestore:在Realtime Database中找到的ChildEventListener的等价物

[英]Firebase : Firestore : What is the equivalent of ChildEventListener found in Realtime Database

我有这个用于Firestore。

FirebaseFirestore   db  = FirebaseFirestore.getInstance();
        CollectionReference ref = db.collection("app/appdata/notifications");
        ref.addSnapshotListener((snapshot, e) -> {
            if (e != null) {
                Log.w(TAG, "Listen failed.", e);
                return;
            }

            for (DocumentSnapshot x : snapshot.getDocuments()) {
                System.out.println(x.getData());
            }
        });

但我不想使用那个循环,而是我只需要获得新的孩子。 我想在Realtime Db中看到类似下面的内容。

ref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
        Post newPost = dataSnapshot.getValue(Post.class);
        System.out.println("Author: " + newPost.author);
        System.out.println("Title: " + newPost.title);
        System.out.println("Previous Post ID: " + prevChildKey);
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {}

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

您需要在QuerySnapshot对象上使用.getDocumentChanges()来获取自上次快照以来的更改列表。 这相当于实时数据库中的子更改事件。 例如:

FirebaseFirestore   db  = FirebaseFirestore.getInstance();
CollectionReference ref = db.collection("app/appdata/notifications");
ref.addSnapshotListener((snapshot, e) -> {
    if (e != null) {
        Log.w(TAG, "Listen failed.", e);
        return;
    }

    for (DocumentChange dc : snapshots.getDocumentChanges()) {
        switch (dc.getType()) {
            case ADDED:
                // handle added documents...
                break;
            case MODIFIED:
                // handle modified documents...
                break;
            case REMOVED:
                // handle removed documents...
                break;
            }
        }
    }
});

有关详细信息,请参阅https://firebase.google.com/docs/firestore/query-data/listen#view_changes_between_snapshots

这就是我实现它的方式。

首先,将DocumentReference初始化为:

DocumentReference mDocRef = FirebaseFirestore.getInstance().document("yourData/notifications");

现在使用你的mDocRef,调用addSnapshotLisetener()为DocumentSnapshot创建新的EventListener,如下所示:

    mDocRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
            //todo your code
        }
    });

因此,这将在您第一次设置数据时以及每次数据更新时获取数据。

此外,如果您将活动作为上下文传递,它将在您的活动停止时自动分离。

..addSnapshotListener(this, new EventListener<DocumentSnapshot>()...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM