【问题标题】:Android Java query firebase null pointer exceptionAndroid Java查询firebase空指针异常
【发布时间】:2017-05-09 20:24:05
【问题描述】:

我正在尝试使用 Firebase 在 Android 中执行类似 WHERE 子句的查询。这是我的代码:

Database d = new Database();
mFirebaseInstance = FirebaseDatabase.getInstance();
usersDatabase = mFirebaseInstance.getReference(d.getUsersTable());
Query queryRef = usersDatabase.orderByChild("email").equalTo(email);
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
     @Override
     public void onDataChange(DataSnapshot snapshot) {
         user = snapshot.getValue(User.class);
     }

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

// credential matches
if(user.getEmail().equals(email) && user.getPassword().equals(password)){
     Intent i = new Intent(getBaseContext(), MainActivity.class);
     startActivity(i);
     finish();
 }else{
     Toast.makeText(LoginActivity.this,"Invalid email or password. Please try again.", Toast.LENGTH_SHORT).show();
 }

但是,我收到以下错误消息:

FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference 
at com.example.LoginActivity$1.onClick(LoginActivity.java:78)
at android.view.View.performClick(View.java:4785)
at android.view.View$PerformClick.run(View.java:19888)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5273)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

有什么想法吗?提前致谢。

【问题讨论】:

  • 检查user.getEmail()user.getPassword() 是否为空
  • 您的user 可能是null
  • 是的,我尝试使用日志进行跟踪,但没有任何结果。我想知道这是执行 WHERE 子句式查询的正确方法吗?让我上传数据库结构
  • 我意识到它甚至没有进入 onDataChanged。有什么想法吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

很明显你的user 对象是空的。要解决您的问题,请使用以下代码:

mFirebaseInstance = FirebaseDatabase.getInstance();
usersDatabase = mFirebaseInstance.getReference().child("Users").child(userId);

ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    String email = (String) dataSnapshot.child("email").getValue();
    String password = (String) dataSnapshot.child("password").getValue();

    if(userEmail.equals(email) && userPassword.equals(password)){
        Intent i = new Intent(getBaseContext(), MainActivity.class);
        startActivity(i);
        finish();
    } else {
        Toast.makeText(LoginActivity.this,"Invalid email or password. Please try again.", Toast.LENGTH_SHORT).show();
    }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersDatabase.addListenerForSingleValueEvent(eventListener);

其中userIdpush()方法生成的唯一id。

userEmailuserPassword 是您要比较的值。

要将userId 从一个活动转移到另一个活动,您可以像这样使用intent

在你的FirstActivity 中使用这个:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("userId", userId);
startActivity(intent);

要让userId 回到您的SecondActivity 中,请使用:

String userId = (String) getIntent().getExtras().get("userId");

希望对你有帮助。

【讨论】:

  • 抱歉,我在哪里以及如何获取用户 ID?它是在我的注册类中随机生成的,我认为我不应该将其解析回 Login 类。
  • 当您使用push() 方法时,您会得到userIdString userId = yourRef.getKey(); 而不是使用它你的reference
  • 抱歉,这是否意味着我必须创建一个全局变量 userID?
  • 不,您唯一需要做的就是在您使用push() 方法的确切时刻将userId 存储在变量中。之后,您将能够在您的reference 中正确使用该userId
  • 对不起,我很困惑。我生成了 push().getKey() 并在 Register 类中存储为 userID。但是后来我在 Login 类中调用了上述方法。他们都是不同的类,我应该如何知道 Login 类中的哪个 userID?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多