当前位置: 首页 > 知识库问答 >
问题:

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

索锐藻
2023-03-14

我是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();
            }
        }

    });

共有1个答案

萧嘉禧
2023-03-14

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

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

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

所以,不确定这是不是它,但试试看:)

 类似资料:
  • 所以我试图将一些数据存储到我的实时数据库中。我目前有两个独立的视图控制器,一个用于用户注册,另一个用于用户选择其配置文件图像并能够更改该图像。在注册页面上,我将“用户名”保存到firebase,如下所示: 对于个人资料图像,我有这样保存的数据 我希望这两个数据都保存在“用户”下-

  • 我正在寻找一种安全的方式来存储用户的敏感媒体像驾照图片。据我所知,没有办法从Firebase存储规则访问Firebase实时数据库,以查看用户是否被授权查看媒体。如果我错了就纠正我。文档中有一些允许某些用户访问介质的方法,但这对我来说并不可行,因为可能有多个用户将访问介质,并且他们的权限状态可能在将来更改。 null

  • 每当我使用Admin SDK从Node运行Firebase实时数据库代码时,进程都会挂起。例如,我可能有一个节点应用程序: 我使用运行。用户将设置为不活动,这很好。但是节点进程将挂起。我必须按ctrl-c才能返回提示。 我应该使用Firebase在节点应用程序中关闭连接或执行其他操作吗?对于Firebase函数,我必须返回从上述调用生成的promise。那么,Firebase函数是否自动处理关闭我

  • 问题内容: 我们的数据模型分为两个数据库上的架构。这些模式是隔离使用的,除了在两者之间桥接的一些单键关系。没有跨两个数据库的写事务。 与这个问题类似,我们要使用Hibernate在不同数据库中的2个表上进行联接,我们想使用Hibernate来处理实体的联接。我们不能使用数据库解决方案(DB2上的联合视图)。 我们为Hibernate设置了两个单独的数据库配置(“医生”和“病人”),当使用DAO显式

  • 我从这个数据存储和托管存储之间的区别中学到了实时数据存储和托管存储?

  • 这就是我的设想。我有一个POJO类,我们称之为Car,声明如下: 在那个类中,列表 图片应该包含到我实际上传图片的Firebase存储的链接。由于Firebase函数的异步根,我在这方面遇到了问题。在第一个时刻,pictures列表具有图像的本地路径,因为我不希望用户在完成向Firebase数据库添加记录所需的所有步骤之前上传任何内容。所以,我只保存图像的本地路径。但是,一旦数据保存到云中,我当然