为了账号安全,请及时绑定邮箱和手机立即绑定

Android Firebase 子节点侦听器

Android Firebase 子节点侦听器

凤凰求蛊 2021-10-20 16:17:13
我想知道当Firebase database节点中的孩子发生变化时是否有一些回调或可以触发方法的东西。比如这个“Users”节点,每个用户都保存了他自己的UID所有数据。我正在寻找一种在profilePic更改时触发的方法。我已经尝试过了addChildEventListener,addValueEventListener但都没有奏效。这是示例refToUsers.getReference(Params.USERS).child(currentUser.getUid()).child(Params.PROFILEPIC).addChildEventListener(new ChildEventListener() {    @Override    public void onChildAdded(DataSnapshot dataSnapshot, String s) {    }    @Override    public void onChildChanged(DataSnapshot dataSnapshot, String s) {        Glide.with(getApplication()).load(s).apply(new RequestOptions()                .placeholder(R.mipmap.ic_launcher))                .into(cvNavUserProfile);    }    @Override    public void onChildRemoved(DataSnapshot dataSnapshot) {    }    @Override    public void onChildMoved(DataSnapshot dataSnapshot, String s) {    }    @Override    public void onCancelled(DatabaseError databaseError) {    }});另一种方法refToUsers.getReference(Params.USERS).child(currentUser.getUid()).child(Params.PROFILEPIC).addValueEventListener(new ValueEventListener() {    @Override    public void onDataChange(DataSnapshot dataSnapshot) {        Log.d(TAG,"DataSnapshot: " + dataSnapshot.toString());        String profilePic = null;    }    @Override    public void onCancelled(DatabaseError databaseError) {    }});profilePic更改时不会触发这些方法。有什么办法可以解决吗?像回调或监听器,这将触发每一次的profilePic是update/change?此外,该方法仅在用户处于特定活动时才有效?即使用户不在方法的活动中,它也能被触发吗?
查看完整描述

3 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

我不知道你的Params.USERS和Params.PROFILEPIC是什么值,但请使用我下面的解决方案和硬编码值:


String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

DatabaseReference uidRef = rootRef.child("users").child(uid);

ValueEventListener valueEventListener = new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

        String profilePic = dataSnapshot.child("profilePic").getValue(String.class);

        Log.d(TAG, profilePic);

    }


    @Override

    public void onCancelled(@NonNull DatabaseError databaseError) {

        Log.d(TAG, databaseError.getMessage()); //Log errors

    }

};

uidRef.addValueEventListener(valueEventListener);

添加值事件侦听器时,onDataChange()每次profilePic属性发生更改时都会触发该方法。


也不要忽略错误。如您所见,我已将它们记录在onCancelled()方法中。


查看完整回答
反对 回复 2021-10-20
?
ITMISS

TA贡献1871条经验 获得超8个赞

找到了解决办法:


  refToUsers.getReference(Params.USERS).child(currentUser.getUid()).child(Params.PROFILEPIC).addValueEventListener(new ValueEventListener() {

        @Override

        public void onDataChange(DataSnapshot dataSnapshot) {

            String profilePic = dataSnapshot.getValue(String.class);

            Log.d(TAG,"DataSnapshot: " + dataSnapshot.toString());

            Log.d(TAG,"profile picture: " + profilePic);

            Glide.with(getApplication()).load(profilePic).apply(new RequestOptions()

                    .placeholder(R.mipmap.ic_launcher))

                    .into(cvNavUserProfile);


        }


        @Override

        public void onCancelled(DatabaseError databaseError) {


        }

    });

工作完美!


查看完整回答
反对 回复 2021-10-20
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

使用这个query:


refToUsers.getReference("users").orderByChild().equalTo(currentUser.getUid()).child("profilePic").addChildEventListener(new ChildEventListener() {


  ...

  ..


// and the rest of your listener


查看完整回答
反对 回复 2021-10-20
  • 3 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信