gpt4 book ai didi

java - Firebase 实时数据库 - 存储用户输入的多个节点

转载 作者:行者123 更新时间:2023-12-01 17:20:28 25 4
gpt4 key购买 nike

我是 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 为每个注册者分配了一个唯一的用户 ID,并且该 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();
}
}

});

最佳答案

我并不是很有经验,但我相信我在尝试从 API 获取和更新信息时遇到了类似的问题。我认为你的问题来自多线程。当您调用 getUid() 函数时,它会创建一个新线程来获取所需的信息。此步骤需要一些时间来完成其任务并从数据库中获取 id。但是,您的 sendUserData() 函数完成其任务所需的时间更少。因此,您可以从 sendUserData() 函数到达代码的第三行,在该函数中,您在线程完成之前使用 UserID 变量,从而留下一个 null 变量。

如果这是问题,您可以通过让应用程序等待线程完成来解决它,或者您可以在点击按钮之前获取用户 ID。我认为第一种方法更好,但是当我解决我的问题时,我找不到一个好的方法来做到这一点。

对于第二种方法,您可以简单地在 onCreate() 方法的请求中创建 UserID 变量并在那里分配它的值。通过这样做,您将在创建 Activity 时创建线程,从数据库中获取信息并关闭线程。当您尝试调用 sendUserData() 函数时,您已经准备好了 userId。

所以,不确定是否是这样,但尝试一下:)

关于java - Firebase 实时数据库 - 存储用户输入的多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61302140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com