![](/img/trans.png)
[英]Firebase addListenerForSingleValueEvent datasnapshot returning 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.