我正在try 使用Firebase数据库.我得到了数据存储部分,但我无法从数据库中检索数据并将其存储在模型类中.模型类如下:

package com.joy.chat_two_point_o.models;

public class Users {
    private String uid,name,phoneNumber,profileImage,email,password;

    public Users(String uid, String name, String phoneNumber, String profileImage, String email, String password) {
        this.uid = uid;
        this.name = name;
        this.phoneNumber = phoneNumber;
        this.profileImage = profileImage;
        this.email = email;
        this.password = password;
    }

    public Users(String email, String password, String uid) {
        this.email = email;
        this.password = password;
        this.uid = uid;
    }

    public Users(String name, String profileImage) {
        this.name = name;
        this.profileImage = profileImage;
    }

    public Users(String uid, String name, String phoneNumber, String profileImage) {
        this.uid = uid;
        this.name = name;
        this.phoneNumber = phoneNumber;
        this.profileImage = profileImage;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Users() {}

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getProfileImage() {
        return profileImage;
    }

    public void setProfileImage(String profileImage) {
        this.profileImage = profileImage;
    }
}

我想从数据库中检索数据并将其存储在这个类中,以便以后可以使用它,并且不需要反复调用数据库,因为我只需要单个 node 的数据.

我写的代码-

FirebaseDatabase.getInstance().getReference().child("users").child(FirebaseAuth.getInstance().getUid())
                        .addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                u = snapshot.getValue(Users.class);
                                Toast.makeText(ProfileActivity.this, u.getName(), Toast.LENGTH_SHORT).show();
                            }

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

                            }
                        });
        binding.name.setText(u.getName());

这里,第一个祝wine 词起作用了,这意味着它显示了我想要的数据.但每当我在其他地方使用它时,如文本视图(名称),它就不起作用,并给我这个错误-

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.joy.chat_two_point_o.models.Users.getName()' on a null object

我知道不知何故,User类的getter给出了一个空值,但它最初是如何工作的呢?为什么它不能在onDataChange函数之外工作?有没有人能解释一下?我试图观看一些视频,但它们使用的是get()方法,而不是这种"User Class"方法.我读了文档,也做了同样的事情,但它仍然不起作用.请告诉我我做错了什么?

推荐答案

我知道不知何故,User类的getter给出了一个空值,但它最初是如何工作的呢?

当您从实时数据库读取数据时,您实际上执行了一个异步操作.您需要了解的是,这样的操作需要时间.然而,你没有办法提前知道需要多少时间,因为这取决于太多的因素.因此,当您将监听程序附加到监听程序时,onDataChange()方法将在读取数据的操作完成时触发.这意味着在你使用的时候:

binding.name.setText(u.getName());

读取数据的操作未完成,这就是u.getName()为空的原因.解决方案总是一样的.任何需要来自实时数据库的数据的代码都需要在onComplete onDataChange()方法中,或者从那里调用.因此,在您的情况下,这将是:

FirebaseDatabase.getInstance().getReference().child("users").child(FirebaseAuth.getInstance().getUid())
        .addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                u = snapshot.getValue(Users.class);
                Toast.makeText(ProfileActivity.this, u.getName(), Toast.LENGTH_SHORT).show();
                binding.name.setText(u.getName()); //?
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.d(TAG, "${it.exception?.message}") //Never ignore potential errors!
            }
        });

如果您想在onDataChange()方法之外使用值u.getName(),那么我建议您使用callback.有关更多信息,我建议您可以查看以下文章:

以及以下视频:

Java相关问答推荐

@GetMapping和@GetExchange有什么区别?

android Document File. isDirector()返回意外结果

从头开始使用Jgit初始化InMemoryRepository

如何在Java中设置字符串与中文字符对齐?

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

CAMEL 4中的SAXParseException

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

RESTful框架类字段是安全的还是不安全的

如何让JVM在SIGSEGV崩溃后快速退出?

GetChildren().emoveAll()不会删除 node

使用存储在字符串变量中的路径目录打开.pdf文件

在settings.gradle.kts和Build.gradle.kts中使用公共变量

Regex以查找不包含捕获组的行

每次我需要时创建和关闭数据库连接会有什么效果吗?

记录是类的语法糖吗?

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

如何通过用户ID向用户发送私信

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

Java 21内置http客户端固定运营商线程

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误