android - 如何使用 Firebase 查询返回 bool 值?

标签 android firebase firebase-realtime-database

我正在尝试创建一个名为 sendRegisterUserMessage() 的方法,如果用户不存在于数据库中,该方法会将用户对象发送到 Firebase 数据库。由于某种原因,尽管使用监听器在数据库中找到了对象,但该方法始终返回 false。

无论如何,我在 onCreate() 的 MainActiviy 中调用此方法:

MessageSenderHandler.getInstance().sendRegisterUserMessage();

在我的 MessageSenderHandler 类中:

//Checks if user is Registered- if not it sends a RegisterUser message
public void sendRegisterUserMessage() {
    System.out.println("registered: " +DatabaseManager.getInstance().isCurrentUserRegistered()); //This prints false no matter what
    if (DatabaseManager.getInstance().isCurrentUserRegistered() == false) {
        FirebaseDatabase.getInstance().getReference().child(MessageTypes.REGISTER_USER_MESSAGE).child(
                CurrentUser.getInstance().getUserId())
                .setValue(
                        new RegisterUserMessage()
                );
    }
}

然后这是我的 DatabaseManager 类中的 isCurrentUserRegistered() 方法

public boolean isCurrentUserRegistered() {
    Query query = databaseReference.child("/" + MessageTypes.REGISTER_USER_MESSAGE + "/" + CurrentUser.getInstance().getUserId());
    query.addValueEventListener(isUserRegisteredDataListener);
    System.out.println("REGISTERED:" + isUserRegisteredDataListener.isUserRegisterd()); //This also prints false no matter what
    return isUserRegisteredDataListener.isUserRegisterd();
}

这是我的 IsUerRegisteredDataListener

public class IsUserRegisteredDataListener implements ValueEventListener {

static boolean exists;

private static IsUserRegisteredDataListener isUserRegisteredDataListener;
public IsUserRegisteredDataListener() {
    isUserRegisteredDataListener = this;
}
public static IsUserRegisteredDataListener getInstance() {
    if (isUserRegisteredDataListener == null) {
        isUserRegisteredDataListener = new IsUserRegisteredDataListener();
    }
    return isUserRegisteredDataListener;
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

        this.exists = dataSnapshot.exists(); 
        System.out.println("EXISTS" + exists)); //This prints true
}

@Override
public void onCancelled(DatabaseError databaseError) {

}

public boolean isUserRegisterd() {
    return exists;
}

我不明白为什么前两种方法打印 FALSE 而带有实际数据监听器的方法在监听器内部打印 TRUE

最佳答案

public boolean isCurrentUserRegistered() {
    Query query = databaseReference.child("/" + MessageTypes.REGISTER_USER_MESSAGE + "/" + CurrentUser.getInstance().getUserId());
    query.addValueEventListener(isUserRegisteredDataListener);
    System.out.println("REGISTERED:" + isUserRegisteredDataListener.isUserRegisterd()); //This also prints false no matter what
    return isUserRegisteredDataListener.isUserRegisterd();
}

在这个方法中,你必须等待 firebase 结果得到 isUserRegistered。因此,您的 IsUserRegisteredDataListener 类无法按您的意愿工作。

你能显示你在哪里初始化 isUserRegisteredDataListener 字段吗?

关于android - 如何使用 Firebase 查询返回 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885255/

相关文章:

android - 带有可绘制对象和文本的按钮布局

angularjs - 使用 Redis 键值存储的实时 Web 应用程序

java - 找不到具有不同 buildvariant 的包名称 "...."的匹配客户端

firebase-realtime-database - 如何在 Flutter 的 FirebaseDatabase 插件中使用 ServerValue

java - 将项目添加到回收站 View 的底部

c# - 如何在 Xamarin Forms 中显示嵌套的项目列表?

android - 我无法将启动画面中的默认 flutter 图标更改为我在 flutter 中选择的图像

ios - 如何在 Xcode 11 中制作连接到 Firebase 的搜索栏页面

ios - Firebase增加值而不读取先前的值?

android - 带有选择器的 AlertDialog