首页 > 解决方案 > Android Frebase 用户数据检索

问题描述

我设计了一个从 firebase 服务器检索用户数据的应用程序。但是 java 代码无法从实时数据库中检索用户的详细信息。

引发的错误是以下行收到NullPointer.

User userDashboard = dataSnapshot.getValue(User.class);
USERNAME.setText(userDashboard.getName().toString().trim()); 
PASSWORD.setText(userDashboard.getPassword().toString().trim());
EMAIL.setText(userDashboard.getEmail().toString().trim());

下面是java代码。

package com.example.loginuiapp;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

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

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 UserDashboard extends AppCompatActivity {

    Button btnLogout;

    private TextView USERNAME, PASSWORD, EMAIL;


    private FirebaseAuth firebaseAuth;
    private FirebaseDatabase firebaseDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // MAKING THE APP FULLSCREEN. KINDLY DO NOT DELETE THE BELOW LINES WITHOUT PRIOR KNOWLEDGE
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_user_dashboard);

        USERNAME = findViewById(R.id.display_username);
        PASSWORD = findViewById(R.id.display_usr_password);
        EMAIL = findViewById(R.id.display_usr_email);


        firebaseAuth = FirebaseAuth.getInstance();
        firebaseDatabase = FirebaseDatabase.getInstance();

        DatabaseReference databaseReference = firebaseDatabase
                .getReference(firebaseAuth.getUid());

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {/*
                User userDashboard = dataSnapshot.getValue(User.class);
                USERNAME.setText(userDashboard.getName().toString().trim());
                PASSWORD.setText(userDashboard.getPassword().toString().trim());
                EMAIL.setText(userDashboard.getEmail().toString().trim());*/
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(UserDashboard.this, "Database Error", Toast.LENGTH_LONG).show();
            }
        });


        // Handling the Logout action when the logout button is clicked.
        btnLogout = findViewById(R.id.logout_button);
        btnLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                // Read this thread to know what's happening
                // https://stackoverflow.com/questions/53334017/back-button-will-bring-to-home-page-after-firebase-logout-on-app
                Intent intent = new Intent(UserDashboard.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
                finish();
                Toast.makeText(UserDashboard.this, "Successfully Logged Out!", Toast.LENGTH_LONG).show();


            }
        });
    }
}

谢谢您的帮助!

标签: androiddatabasefirebasefirebase-realtime-database

解决方案


在您的数据库参考中,确保您拥有正在检索的数据的正确路径,例如

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("your/path/to/data");
ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //making sure snapshot consists some data 
            if (dataSnapshot.exists()) {
                //do your stuff
                User userDashboard = dataSnapshot.getValue(User.class);
                USERNAME.setText(userDashboard.getName().toString().trim());
                PASSWORD.setText(userDashboard.getPassword().toString().trim());
                EMAIL.setText(userDashboard.getEmail().toString().trim());
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(UserDashboard.this, "Database Error", Toast.LENGTH_LONG).show();
        }
    });

推荐阅读