【问题标题】:Adding an Input Value to an Existing Firebase Database Value Java?将输入值添加到现有 Firebase 数据库值 Java?
【发布时间】:2021-09-03 14:11:32
【问题描述】:

我有一个 activity 将活动时间数据注册到我的 Firebase 实时数据库,这是使用 EditText 手动输入的,然后在 UI 中将其显示到 TextView。这一切都很好,但是,如果我要放入更多数据,它将简单地替换数据库中的值和TextView

我之前在另一个活动 (Adding (Sum) multiple Firebase child values together to give a total value?) 中做过类似的事情,但是,这个活动有额外的带有日期等的节点,所以同样的方法在我当前的活动中不起作用。理想情况下,我会用 dateStrings 等组织这个节点,但是,出于演示目的,这不是必需的。因此,我只想获取数据库中已经存在的任何值并将输入值添加到其中,然后将其恢复到数据库中。

这可能很简单,但我一直盯着它看太久了,我自己都糊涂了。这远非正确,但对我的下一步有点困惑。我可能已经看到了类似how to sum money value in firebase realtime android studio 的内容,但想知道这是否是最简单的方法?

注册Activity方法:

    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 层次结构:

【问题讨论】:

  • 我不确定我是否理解。是否要更新数据库中的字段?如果这是您想要的,希望更新哪个字段?
  • 例如.. 在层次结构上,活动时间刚刚为 500(分钟),如果我再进行 90 分钟的活动,我想将 90 添加到该值,然后更新它显示 590。

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案1】:

根据你上一条评论:

活动时间刚刚为 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!
    }
});

【讨论】:

  • 嘿凯特琳。我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2017-12-05
  • 2021-04-05
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多