繁体   English   中英

Android Studio Firebase 数据库数据快照返回 null

[英]Android Studio Firebase Database DataSnapshot returning null

TLDR:我一直在尝试从 Firebase 实时数据库中检索用户信息,但 addChildEventListener 或dataSnapshot中的 dataSnapshot 似乎总是返回 null。 我完全按照 API 无济于事。 请发送帮助!

我的个人资料活动:

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

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;

import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
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;

public class ProfileActivity extends AppCompatActivity {
    private static final String tag = "ProfileActivity";
    private static final int PROFILE_ACTIVITY = 1;

    //firebase elements
    private FirebaseAuth mAuth;
    private FirebaseDatabase mDatabase;
    private DatabaseReference mReference;
    private FirebaseUser currentUser;

    //view elements
    private Button logoutBtn;
    private TextView walletBalance, tasksTaken, tasksPosted, userName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);

        mAuth = FirebaseAuth.getInstance();
        mDatabase = FirebaseDatabase.getInstance();
        currentUser = mAuth.getCurrentUser();
        mReference = mDatabase.getReference(mAuth.getUid());
        Query query = mReference;

        query.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Log.d(tag, dataSnapshot.getValue().toString());
                if(dataSnapshot.getValue() != null)
                {
                    Log.d(tag, "not null");
                    User newUser = dataSnapshot.getValue(User.class);
                    Log.d(tag, newUser.getName());
                    Log.d(tag, Integer.toString(newUser.getWalletBalance()));
                    Log.d(tag, Integer.toString(newUser.getTasksTaken()));
                    Log.d(tag, Integer.toString(newUser.getTasksPosted()));

                    userName.setText(newUser.getName());
                    walletBalance.setText(newUser.getWalletBalance());
                    tasksTaken.setText(newUser.getTasksTaken());
                    tasksPosted.setText(newUser.getTasksPosted());
                }
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

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

            }
        });

    private void setViewElements() {
        logoutBtn = findViewById(R.id.btn_logout);
        walletBalance = findViewById(R.id.tv_walletBalance);
        tasksTaken = findViewById(R.id.tv_taskSAmount);
        tasksPosted = findViewById(R.id.tv_taskPAmount);
        userName = findViewById(R.id.tv_userName);
    }

    private void goToLoginActivity() {
        startActivity(new Intent(getApplicationContext(), LoginActivity.class));
        finish();
    }

我的用户 Object:

public class User {
    //user information
    String name, email, password;
    int walletBalance, tasksTaken, tasksPosted;


    //constructor
    public User(String name, String email, String password, int walletBalance, int tasksTaken, int tasksPosted) {
        this.name = name;
        this.email = email;
        this.password = password;
        this.walletBalance = walletBalance;
        this.tasksTaken = tasksTaken;
        this.tasksPosted = tasksPosted;
    }

    //empty constructor
    public User() {

    }

    public String getName() {
        return name;
    }

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

    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 int getWalletBalance() {
        return walletBalance;
    }

    public void setWalletBalance(int walletBalance) {
        this.walletBalance = walletBalance;
    }

    public int getTasksTaken() {
        return tasksTaken;
    }

    public void setTasksTaken(int tasksTaken) {
        this.tasksTaken = tasksTaken;
    }

    public int getTasksPosted() {
        return tasksPosted;
    }

    public void setTasksPosted(int tasksPosted) {
        this.tasksPosted = tasksPosted;
    }
}

我的 Firebase 数据库:

在此处输入图像描述

非常感谢任何帮助!

你的参考是错误的。 您应该首先在参考中编写“用户”节点。 此外,您不应该在没有过滤或排序的情况下使用查询。

mReference = mDatabase.getReference("users").child(mAuth.getUid());    

当您使用以下参考时:

mReference = mDatabase.getReference(mAuth.getUid());

随着:

.addChildEventListener(/* ... */)

这意味着您正在尝试读取用户 object 中存在的所有子项。 用户 object 的直接子代实际上是User class 中定义的值。 如果您想获取登录用户的详细信息,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user = dataSnapshot.getValue(User.class);
        Log.d("TAG", user.getName());
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
    }
};
uidef.addListenerForSingleValueEvent(valueEventListener);

上述代码的结果将是在 logcat 中打印出的登录用户名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM