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

向现有Firebase数据库值Java添加输入值?

刁越
2023-03-14

我有一个活动,它将活动时间数据注册到我的Firebase实时数据库中,这是使用编辑文本手动输入的,然后将其显示到UI中的文本视图。这一切都很好,但是,如果我要输入更多数据,它只需替换数据库中的值和TextView

我以前在另一个活动中做过类似的事情(将多个Firebase子值相加(合计)以得到总价值?),但是,这个活动有额外的带日期的节点等,所以同样的方法在我当前的活动中不起作用。理想情况下,我将使用dateStrings等组织此节点,但是,出于演示目的,没有必要。因此,我只想获取数据库中已经存在的任何值,并向其添加输入值,然后将其恢复到数据库。

这可能很简单,但是我已经盯着它看了很久,我把自己弄糊涂了。这一点都不正确,但对我接下来的步骤有点困惑...我可能已经看到了一些沿着这些路线如何在Firebase实时Android Studio中求和金钱价值,但想知道这是否是最简单的方法?

注册活动方法:

    registerActivity.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String activityTime = activeMinutes.getText().toString().trim();
            databaseReference.child("active time").setValue(activityTime);
            addActivity.setVisibility(View.VISIBLE);
            registerActivity.setVisibility(View.GONE);
            activeTimeTI.setVisibility(View.GONE);
        }
    });

显示数据的方法(缩短):

    databaseReference.addValueEventListener(new ValueEventListener() {
        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            int total = 0;

           String activityTime = dataSnapshot.child("active time").getValue(String.class);

            if (activityTime == null) {
                activeTimeTV.setText("0");
            } else {
                total += Integer.parseInt(activityTime);
                activeTimeTV.setText(String.valueOf(total) + " minutes");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w("TAG", "onCancelled", databaseError.toException());
        }
    });

Firebase层次结构:

共有1个答案

平山
2023-03-14

根据你最后的评论:

现在的活动时间是500(分钟),如果我再做90分钟的活动,我想在该值上加上90,然后将其更新为590。

要将“活动时间”的值增加90,首先,您需要将字段的类型更改为数字。话虽如此,你的领域应该是这样的:

ndkdn
 |
 --- active time: 500

看,没有引号。如果您的“ndkdn”节点是Firebase实时数据库根目录的直接子节点,要将该值增加90,只需使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference activeTimeRef = rootRef.child("ndkdn").child("active time");
activeTimeRef.setValue(ServerValue.increment(90));

这种操作是原子的。如果不允许您更改字段的类型以获得一致的数据,则应首先读取值,然后使用事务将其递增:

activeTimeRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        Integer activeTime = Integer.parseInt(mutableData.getValue(String.class));
        if (score == null) {
            return Transaction.success(mutableData);
        }
        mutableData.setValue((activeTime + 90) + "");
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError error, boolean b, DataSnapshot snapshot) {
        Log.d("TAG", error.getMessage()); //Don't ignore potential errors!
    }
});
 类似资料:
  • 事件适配器 事件活动 @override public void onBindViewHolder(@nonnull ViewHolder holder,final int position){

  • 我无法在Firebase实时数据库中添加任何数据。数据库连接正常,但我无法添加任何数据。当我单击“到”按钮时,添加到数据库中的数据。 主要活动。java-代码 事件。java-代码

  • 问题内容: 我想向Firebase身份验证添加新数据,其中包含显示名称,电话号码,图像之类的数据。但是我想增加更多这样的性别,生日等等。是否可以添加新的? 问题答案: 无法将任意其他数据添加到Firebase身份验证用户配置文件。如果需要,请考虑使用Firebase Realtime数据库(或CloudFirestore)存储其他信息。 自几周前以来,您可以向Firebase身份验证用户配置文件中

  • 我想添加一个新的数据到firebase认证,它有像displayname,电话号码,图像的数据。但我想增加更多这样的性别,生日和更多。有可能添加新的吗?

  • 我想向数据库中插入值,但它无法工作,尽管我的代码在用作存储过程时运行良好。我需要使用按钮点击来存储值。请告诉我代码有什么问题。它没有显示任何错误或异常,但表中的数据没有更新

  • 我在生产中有一个基于Hibernate的应用程序,有一个大型数据库。我需要在这个应用程序中向两个实体(两个表)添加审计,我决定使用Envers。 对于每次插入、更新或删除,Envers都会向实体的审核表中添加一条新记录。 如果从应用程序一开始就支持Envers,那么审计表将在实体创建(INSERT)时填充。 Envers留档非常薄,没有提到任何关于将Envers添加到现有应用程序的内容。 如果我简