【问题标题】:Firebase Reading Data Error onDataChange method on null object reference空对象引用上的 Firebase 读取数据错误 onDataChange 方法
【发布时间】:2018-03-25 21:58:08
【问题描述】:

我在从 firebase DB 读取数据时遇到错误,我正在尝试允许使用 MAC 地址登录:

错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

数据:

这是我的代码:

 DatabaseReference users = FirebaseDatabase.getInstance().getReference("users");
Query query = users.orderByChild("macAddress").equalTo(getMacAddr());
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()) {
            User user = dataSnapshot.getValue(User.class);
            if(!(user.getEmail().equals(edtEmail.getText().toString()))){
                Snackbar.make(rootLayout, "Please Login With Phone You Registered With", Snackbar.LENGTH_SHORT).show();
                waitingdialog.dismiss();
                return;
            }
        }
        else{
            Snackbar.make(rootLayout, "Please Login With Phone You Registered With", Snackbar.LENGTH_SHORT).show();
            waitingdialog.dismiss();
            return;
        }
    }

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

getMacAddr() 是一个以字符串形式返回设备mac地址的函数

上面代码中使用的User.class代码:

public class User {

private  String email,password,name,phone,macAddress;
private int isSecured;

public User(String email, String name, String password,String phone,String macAddress,int isSecured){

    this.email=email;
    this.name=name;
    this.password=password;
    this.phone=phone;
    this.macAddress=macAddress;
    this.isSecured=isSecured;
}
public User() {}

public int getIsSecured() {
    return isSecured;
}

public void setIsSecured(int isSecured) {
    this.isSecured = isSecured;
}

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 String getName() {
    return name;
}

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

public String getMacAddress() {
    return macAddress;
}

public void setMacAddress(String macAddress) {
    this.macAddress = macAddress;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}
}

这是用于创建用户对象的 User.class

【问题讨论】:

  • 请也提供您的 User.class 代码
  • @JagarYousef 完成
  • 尝试包含一个 if 语句 if(user.getEmail() != null) 但有时当某处存在不合逻辑的代码时,Firebase 中会发生此空异常,不幸的是,我在您的代码中没有看到它。
  • 只是为了好玩 - 在用户中的 null 构造函数中,将“电子邮件”字段设置为“我从未设置过”并将电子邮件添加到您的快餐栏消息中。似乎您没有收到电子邮件字段。
  • 这是错字吗:edtEmail.getText() ???

标签: java android database firebase


【解决方案1】:

我刚刚发现错误,我改变了这一行:

Query query = users.orderByChild("macAddress").equalTo(getMacAddr());

Query query=users.child(auth.getCurrentUser().getUid()).orderByChild("email");

auth 是 FirebaseAuth 对象

【讨论】:

    【解决方案2】:

    假设问题确实在您提供并给出错误消息的代码中

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

    我认为问题出在这一行:

    Query query = users.orderByChild("macAddress").equalTo(getMacAddr());
    

    更具体地说,users.orderByChild("macAddress") 似乎正在返回null。我将研究如何在 Firebase 数据库中定义 users 条目,并确保其结构正确。也许您可以尝试在问题行上放置一个断点并检查 users 对象以验证 users.orderByChild("macAddress") 没有返回 null 并根据需要对 Firebase 数据库进行更正。

    【讨论】:

    • orderByChild 只是 Firebase 查询构建器的一部分。它永远不会返回null。看起来更像user.getEmail() 返回null,即user.getEmail().equals(...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多