java - 当数据更改时,Firebase 不会检索最后的数据,并且不会以正确的方式执行 addValueEventListener 内的条件

标签 java android firebase firebase-realtime-database

我试图根据数据库中的值条件在 addValueEventListener 中执行一些代码,但是当数据更改时,监听器根据旧数据执行条件,并在第二次尝试监听器执行我想要使用的数据。但是数据更改监听器执行listener(-1)数据。更清楚地说,如果存在“禁用”或“停止”子项,我不想执行代码,但是在更新数据并且这些子项不存在之后,我调用 AddMessage 方法时的条件不再执行,但它执行方法当我第二次调用时,它会正确执行,直到下次更新数据为止,它会再次出现相同的问题。

sendMessage.setOnClickListener(new View.OnClickListener() {@Override
    public void onClick(View v) {
        AddMessage();
    }
});

private void AddMessage() {
    nListener = RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                if (!dataSnapshot.hasChild("disable") && !dataSnapshot.hasChild("stop")) {
                    HashMap <String,String> chatMessageMap = new HashMap <>();
                    chatMessageMap.put("from", messageSenderID);
                    chatMessageMap.put("type", "check");
                    chatMessageMap.put("content", messageText);
                    MessagesRef.child(messageReceiverID).push().setValue(chatMessageMap);
                    RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
                } else {
                    RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

最佳答案

sendMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        String stoppedUser;

        myDbref = FirebaseDatabase.getInstance().getReference().child("List Ref").child(<UID_OF_RECEIVER_OF_MESSAGE>);
        myDbref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                stoppedUser = dataSnapshot.child(<UID_OF_SENDER>).child("stop").getValue().toString();

                //Now use if-else statement
                if(<UID_OF_RECEIVER> == stoppedUser){
                    Toast.makeText(getApplicationContext(), "You are blocked.", Toast.LENGTH_LONG).show();
                } else {
                    AddMessage();
                }

            }catch (Throwable e){
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }

    });

虽然你可以获得<UID_OF_SENDER>通过使用FirebaseUser currentUserUID = FirebaseAuth.getInstance().getCurrentUser(); 确保输入 <UID_OF_RECEIVER> 的值正确,并根据需要更正数据库路径。

关于java - 当数据更改时,Firebase 不会检索最后的数据,并且不会以正确的方式执行 addValueEventListener 内的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61288719/

相关文章:

java - DecimalFormat 四舍五入

java - Spring-Boot:使用 Redis 作为 Session Store 时出现异常

未调用 Java JPanel paintComponent(Graphics g)

Android Web View 在布局宽度变化时被拉伸(stretch)

java - 从 fragment 打开的 Activity 立即关闭

java - 将 firebase 添加到应用程序时出现 appcompat 依赖项错误

java - 如何在 Swing 中创建通知

android - 如何通过电子邮件发送密码?

java - Android Firebase : Cannot figure out how to use GSON to make pojo

firebase - 如何使用 flutter 删除 Firebase 存储文件?