【问题标题】:How to retrieve a particular data from Firebase database如何从 Firebase 数据库中检索特定数据
【发布时间】:2020-04-16 13:09:12
【问题描述】:

我正在做一个应用程序,用户将根据角色登录。一个适用于管理员和员工的应用程序。

在这里,当管理员喜欢它时,它应该显示一个不同的仪表板,我们该怎么做,据我所知,我有点厌倦了检索当前用户的角色,但对我来说它在 firebaseuser 中显示空指针异常。

 package com.example.loginregistration;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
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.auth.FirebaseUser;
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.Query;
import com.google.firebase.database.ValueEventListener;
import com.rengwuxian.materialedittext.MaterialEditText;

public class MainActivity extends AppCompatActivity {

    MaterialEditText email,password;
    Button login, register;
    FirebaseAuth fAuth;
    FirebaseUser User;
    DatabaseReference reff;
    String Role="";
    CheckBox loginstate;
    Query query,query1;

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

        email = findViewById(R.id.email);
        password = findViewById(R.id.password);
        fAuth = FirebaseAuth.getInstance();
        //loginstate = findViewById(R.id.checkbox);
        login = findViewById(R.id.login);
        register = findViewById(R.id.register);




        //query = FirebaseDatabase.getInstance().getReference().child("Employee").orderByChild("role");
        //query1 = FirebaseDatabase.getInstance().getReference().child("Employee").orderByChild(User.getUid()).equalTo("role");

        //final Query query1 = FirebaseDatabase.getInstance().getReference().child("Employee").orderByChild("Role").equalTo("User");


        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //String txtUserName = userName.getText().toString();
                String txtEmail = email.getText().toString().trim();
                String txtPassword = password.getText().toString().trim();
                //String txtMobile = mobile.getText().toString();

                if (TextUtils.isEmpty(txtEmail)){
                    email.setError("Email is Required.");
                    return;
                }

                if (TextUtils.isEmpty(txtPassword)){
                    password.setError("Password is Required.");
                    return;

                }

                if (password.length() < 6){

                    password.setError("Password must be more than 6 characters.");
                    return;

                }


                fAuth.signInWithEmailAndPassword(txtEmail,txtPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()){

                            retrieve();

                            String user = task.getResult().getUser().getUid();



                            if (Role.equals("Admin")){
                                Toast.makeText(MainActivity.this,"Logged in successfully.",Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(getApplicationContext(),AppStartActivity.class));
                            }
                            else {
                                Toast.makeText(MainActivity.this,"Logged in successfully.",Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(getApplicationContext(),AppStartActivity.class));
                            }

                        }

                        /*else if (task.isSuccessful() && Role.equals("User")) {
                            Toast.makeText(MainActivity.this,"Logged in successfully.",Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(getApplicationContext(),EmpStarActivity.class));
                        }
*/
                        else {
                            Toast.makeText(MainActivity.this, "Error ! " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();

                        }
                    }
                });

            }
        });
    }

    private void retrieve(){
        User = fAuth.getCurrentUser();

        reff = FirebaseDatabase.getInstance().getReference().child(User.getUid());

        reff.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                        /*for (DataSnapshot snap : dataSnapshot.getChildren())
                        {*/
                //Employee student = dataSnapshot.getValue(Employee.class);
                //Log.d("TAG","name: "+student.getRole());

                //Role = dataSnapshot.child("Admin").getValue(String.class);


                String Role = dataSnapshot.child("role").getValue().toString();
                //String prize = dataSnapshot.child("prize").getValue().toString();
                Log.e("Role", Role);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

我的数据库看起来像

我想检查这个人是否是管理员是用户的条件,然后根据它显示活动。

错误已在此处列出

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
        at com.example.loginregistration.MainActivity.onCreate(MainActivity.java:53)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
2020-04-16 19:02:12.431 1943-1978/system_process E/BatteryExternalStatsWorker: no controller energy info supplied for wifi
2020-04-16 19:02:13.267 1622-2110/? E/AudioPolicyIntefaceImpl: getInputForAttr permission denied: recording not allowed for uid 10023 pid 3445
2020-04-16 19:02:13.267 1622-2110/? E/AudioFlinger: createRecord() checkRecordThread_l failed
2020-04-16 19:02:13.267 3445-18622/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord returned error -22
2020-04-16 19:02:13.267 3445-18622/com.google.android.googlequicksearchbox:search E/AudioRecord: AudioFlinger could not create record track, status: -22
2020-04-16 19:02:13.267 3445-18622/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
2020-04-16 19:02:13.269 3445-18622/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
2020-04-16 19:02:13.272 3445-18622/com.google.android.googlequicksearchbox:search E/ActivityThread: Failed to find provider info for com.google.android.apps.gsa.testing.ui.audio.recorded
2020-04-16 19:02:18.343 1622-2110/? E/AudioPolicyIntefaceImpl: getInputForAttr permission denied: recording not allowed for uid 10023 pid 3445
2020-04-16 19:02:18.343 1622-2110/? E/AudioFlinger: createRecord() checkRecordThread_l failed
2020-04-16 19:02:18.344 3445-18622/com.google.android.googlequicksearchbox:search E/IAudioFlinger: createRecord returned error -22
2020-04-16 19:02:18.344 3445-18622/com.google.android.googlequicksearchbox:search E/AudioRecord: AudioFlinger could not create record track, status: -22
2020-04-16 19:02:18.345 3445-18622/com.google.android.googlequicksearchbox:search E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
2020-04-16 19:02:18.346 3445-18622/com.google.android.googlequicksearchbox:search E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
2020-04-16 19:02:18.347 3445-18622/com.google.android.googlequicksearchbox:search E/ActivityThread: Failed to find provider info for com.google.android.apps.gsa.testing.ui.audio.

【问题讨论】:

  • 请编辑您的问题以包含确切的错误消息和堆栈跟踪,因为您可以在 logcat 输出中找到它们。
  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题和回复中@。
  • @FrankvanPuffelen 我在问题中添加了错误。请检查并回复。

标签: android firebase firebase-realtime-database firebase-authentication multi-user


【解决方案1】:

您甚至无法在登录应用程序之前检索uid。 在if(task.isSuccessful()){ 内部执行以下操作:

String user = task.getResult().getUser().getUid();

然后你可以在你的 dB 参考中使用它


尝试以下方法来检索角色:

private void retrieve(){
        //User = fAuth.getCurrentUser();

        reff = FirebaseDatabase.getInstance().getReference().child("Employee").child("Admin");

        reff.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                        /*for (DataSnapshot snap : dataSnapshot.getChildren())
                        {*/
                //Employee student = dataSnapshot.getValue(Employee.class);
                //Log.d("TAG","name: "+student.getRole());

                //Role = dataSnapshot.child("Admin").getValue(String.class);


                String Role = dataSnapshot.child("role").getValue().toString();
                //String prize = dataSnapshot.child("prize").getValue().toString();
                Log.e("Role", Role);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

【讨论】:

  • 现在我收到错误空指针错误 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on an null object reference at com.example.loginregistration.MainActivity$2.onDataChange(MainActivity.java:140) 在 com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.4:75)
  • 你明白了吗
  • 字符串角色 = dataSnapshot.child("role").getValue().toString();获取空点异常
  • 这是一个不同的问题。角色在 Employee/Admin 之下,角色之上没有 uid
  • 你能帮我解决这个问题吗?如何检索该特定数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2019-02-07
  • 2023-04-05
相关资源
最近更新 更多