我是Firebase和android studio的新手,我正在尝试将多个节点保存在Firebase中,我有一个节点要保存给“用户”,但我需要另一个节点来保存“预算”类别。最初,我认为我的OnClickListener有问题,但检查后,它工作正常。这是在我的注册中发送用户数据的代码:
private void sendUserData(){
String UserID = firebaseAuth.getUid();
RegDB regDB = new RegDB(emailDb, nameDb, passwordDb);
mDatabase.child("Users").child(UserID).setValue(regDB);
}这是在我的预算页面中发送用户数据的代码:
private void sendUserData() {
String UserID = firebaseAuth.getUid();
CategoriesDB catDb = new CategoriesDB(travel_budget, entertainment_budget, fitness_budget, beauty_budget, clothes_budget, holiday_budget, food_budget, mobile_budget);
mDatabase.child("Users").child(UserID).child("Categories").setValue(catDb);
}一旦我尝试输入预算,我就一直收到这个错误,尽管Firebase正在为每个注册的人分配一个唯一的userID,并且这个ID被存储在实时数据库和身份验证中:
java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()作为参考,这是我的注册页面的OnClickListener:
button_Upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (validate()) {
String emailDb = email.getText().toString().trim();
String passwordDb = password.getText().toString().trim();
firebaseAuth.createUserWithEmailAndPassword(emailDb, passwordDb).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
sendUserData();
firebaseAuth.signOut();
Toast.makeText(Register.this, "Successfully Registered!", Toast.LENGTH_SHORT).show();
finish();
startActivity(new Intent(Register.this, Menu.class));
} else {
Toast.makeText(Register.this, "Registration Failed.", Toast.LENGTH_SHORT).show();
}
}
});还有我的预算页面的OnClickListener:
btn_subCat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(validate()){
sendUserData();
Toast.makeText(Categories.this, "Completed!", Toast.LENGTH_LONG).show();
finish();
startActivity(new Intent(Categories.this, Menu.class ));
}else{
Toast.makeText(Categories.this, "Submission failed", Toast.LENGTH_LONG).show();
}
}
});发布于 2020-04-19 18:14:13
我没有真正的经验,但我相信我在尝试从API获取和更新信息时遇到了类似的问题。我认为你的问题来自于多线程。当您调用getUid()函数时,它会创建一个新线程来获取所需的信息。这个tread需要一些时间来完成它的任务并从数据库中获取id。但是,您的sendUserData()函数完成其任务所需的时间更短。因此,在sendUserData()函数的第三行代码中,您在线程结束之前使用了UserID变量,留下了一个空变量。
如果这就是问题所在,您可以通过让应用程序等待线程完成来解决它,或者您可以在点击按钮之前获取用户id。我认为第一种方法更好,但是当我解决我的问题时,我找不到一个好的方法来做到这一点。
对于第二种方法,您可以简单地在onCreate()方法的请求中创建UserID变量,并在那里为它赋值。通过这样做,您将在创建活动时创建线程,从数据库中获取信息并关闭线程。当您尝试调用sendUserData()函数时,您已经准备好了userId。
因此,我不确定是否就是这样,但可以试一试:)
https://stackoverflow.com/questions/61302140
复制相似问题