【问题标题】:Check if value in Firebase Realtime Database is equal to String [duplicate]检查 Firebase 实时数据库中的值是否等于字符串 [重复]
【发布时间】:2019-01-31 13:10:20
【问题描述】:

当用户登录我的应用程序时,我想检查 userType 是“客户”还是“场地所有者”。这决定了接下来运行哪个活动。目前,应用程序在尝试登录时崩溃。

这是我的 Firebase 实时数据库结构:

相关代码如下:

public void loginUser(View v)
{
    if(e1.getText().toString().equals("") && e2.getText().toString().equals(""))
    {
        Toast.makeText(getApplicationContext(),"Blank fields not allowed", Toast.LENGTH_SHORT).show();
    }
    else
    {
        auth.signInWithEmailAndPassword(e1.getText().toString(),e2.getText().toString())
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful())
                        {
                            Toast.makeText(getApplicationContext(),"User logged in successfully",Toast.LENGTH_SHORT).show();
                            finish();


                            //Intent i = new Intent(getApplicationContext(),ProfileActivity.class);
                            //startActivity(i);
                            DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();
                            mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    //String userType = dataSnapshot.getValue(String.class);

                                    String userType = (String) dataSnapshot.child("userType").getValue();
                                    if (userType.equals("Customer")) {
                                        Intent i = new Intent(getApplicationContext(), UserMainPageActivity.class);
                                        startActivity(i);

                                    } else {
                                        Intent i = new Intent(getApplicationContext(), ProfileActivity.class);
                                        startActivity(i);
                                    }
                                }

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

                                }
                            });
                        }
                        else
                        {
                            Toast.makeText(getApplicationContext(),"User could not be logged in",Toast.LENGTH_SHORT).show();
                        }
    }
});
    }
}

根据要求,这里是崩溃日志:

01-31 13:35:14.348  5322  5322 E AndroidRuntime: FATAL EXCEPTION: main
01-31 13:35:14.348  5322  5322 E AndroidRuntime: Process: 
com.example.myapplication, PID: 5322
01-31 13:35:14.348  5322  5322 E AndroidRuntime: 
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean 
java.lang.String.equals(java.lang.Object)' on a null object reference
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.example.myapplication.LoginActivity$1$1.onDataChange(
LoginActivity.java:66 01-31 13:35:14.348  5322  5322 E AndroidRuntime:        
at com.google.firebase.database.zzp.onDataChange(Unknown Source)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.google.android.gms.internal.firebase_database.zzfc.zza(Unknown Source)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.google.android.gms.internal.firebase_database.zzgx.zzdr(Unknown Source)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.google.android.gms.internal.firebase_database.zzhd.run(Unknown Source)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
android.os.Handler.handleCallback(Handler.java:746)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
android.os.Handler.dispatchMessage(Handler.java:95)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
android.os.Looper.loop(Looper.java:148)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
android.app.ActivityThread.main(ActivityThread.java:5443)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
java.lang.reflect.Method.invoke(Native Method)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:728)
01-31 13:35:14.348  5322  5322 E AndroidRuntime:        at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

这是整个班级:

    package com.example.myapplication;

    import android.content.Intent;
    import android.support.annotation.NonNull;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;

    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    import com.google.firebase.auth.AuthResult;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.database.DataSnapshot;
    import com.google.firebase.database.DatabaseError;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.google.firebase.database.ValueEventListener;

    public class LoginActivity extends AppCompatActivity {

EditText e1,e2;

FirebaseAuth auth;

private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    e1 = (EditText)findViewById(R.id.editText);
    e2 = (EditText)findViewById(R.id.editText2);

    auth = FirebaseAuth.getInstance();
}

public void loginUser(View v)
{
    if(e1.getText().toString().equals("") && e2.getText().toString().equals(""))
    {
        Toast.makeText(getApplicationContext(),"Blank fields not allowed", Toast.LENGTH_SHORT).show();
    }
    else
    {
        auth.signInWithEmailAndPassword(e1.getText().toString(),e2.getText().toString())
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful())
                        {
                            Toast.makeText(getApplicationContext(),"User logged in successfully",Toast.LENGTH_SHORT).show();
                            finish();

                            //Intent i = new Intent(getApplicationContext(),ProfileActivity.class);
                            //startActivity(i);

                            String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                            DatabaseReference uidRef = rootRef.child(uid);
                            uidRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    if(dataSnapshot.child("userType").equals("Customer")) {
                                        startActivity(new Intent(getApplicationContext(), UserMainPageActivity.class));
                                    } else if (dataSnapshot.child("userType").equals("Venue Owner")) {
                                        startActivity(new Intent(getApplicationContext(), ProfileActivity.class));
                                    }
                                }

                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                    Log.d(TAG, databaseError.getMessage());
                                }
                            });
                        }
                        else
                        {
                            Toast.makeText(getApplicationContext(),"User could not be logged in",Toast.LENGTH_SHORT).show();
                        }
            }
        });
    }
}

}

【问题讨论】:

  • 添加你的暗恋日志
  • 尝试调试是否获得了 userType 的值。
  • @TamirAbutbul 我添加了崩溃日志

标签: java android firebase firebase-realtime-database


【解决方案1】:

要解决这个问题,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.child("userType").getValue(String.class).equals("Customer")) {
            startActivity(new Intent(getApplicationContext(), UserMainPageActivity.class));
        } else if (dataSnapshot.child("userType").getValue(String.class).equals("Venue Owner")) {
            startActivity(new Intent(getApplicationContext(), ProfileActivity.class));
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

使用此代码,用户将被重定向到相应的活动。

【讨论】:

  • 使用此代码,应用程序不再崩溃。但是它没有打开活动 UserMainPageActivity 或 ProfileActivity。当您按下登录时,页面关闭但应用程序不前进,它会返回到起始页面。
  • 您在哪个活动地点唱这个代码?你能分享一下吗? onDataChange 甚至被调用了吗?
  • 对我的问题进行了编辑以显示此代码的位置
  • 我现在明白了,但您没有使用我的全部答案。你的DatabaseReference 是错误的。将此 DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference(); mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() 更改为 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference uidRef = rootRef.child(uid); uidRef.addListenerForSingleValueEvent(new ValueEventListener()
  • 现在可以用了吗?
【解决方案2】:

您必须获取数据快照的子项。由于响应是作为数据快照的子级来的。 像这样。

      public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
               String userType = (String) dataSnapshot.child("userType").getValue();
            if (userType.equals("Customer")) {
                       Intent i = new Intent(getApplicationContext(), 
                       UserMainPageActivity.class);
                      startActivity(i);

            } else {
    I          Intent i = new Intent(getApplicationContext(), 
                ProfileActivity.class);
                   startActivity(i);
                 }
             }
        }

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多