首页 > 解决方案 > 如何将数据推送到firebase?

问题描述

我知道如何将数据推送到 firebase 数据库,但我遇到了问题。让我先展示我的代码:

我的 java 类如下所示:

public void btn_continue(View view) {
        final String str_c2c = c2c.getText().toString().trim();
        final String str_amount = samount.getText().toString().trim();

        if (!TextUtils.isEmpty(str_c2c) && str_amount != null){
            lareview.setVisibility(View.VISIBLE);
            lasend.setVisibility(View.GONE);

            amount.setText(str_amount);

            mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
            mDatabaseUsers.child(str_c2c).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    String u_name = dataSnapshot.child("name").getValue().toString();
                    target_name.setText(u_name);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                    target_name.setText("Your target user was not found!");
                    target_name.setTextColor(Color.RED);
                }
            });
        }
    }

    public void btn_confirm(View view) {
        final String str_balance = balance.getText().toString().trim();
        Double d_balance = Double.parseDouble(str_balance);
        final String str_c2c = c2c.getText().toString().trim();
        final String str_amount = samount.getText().toString().trim();
        //change todouble
        final Double d_samount = Double.parseDouble(str_amount);
        if (!TextUtils.isEmpty(str_c2c) && str_amount != null){
            if (d_samount>d_balance){
                Toast.makeText(Transfer.this, "Amount cant be higher than your balance", Toast.LENGTH_LONG).show();
            }else {
                lareview.setVisibility(View.VISIBLE);
                lasend.setVisibility(View.GONE);

                mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
                mDatabaseUsers.child(str_c2c).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        final String userID = auth.getCurrentUser().getUid();

                        final long PostTime = new Date().getTime();
                        String str_posttime = Long.toString(PostTime);
                        String u_name = dataSnapshot.child("name").getValue().toString();
                        String u_tagetbalance = dataSnapshot.child("balance").getValue().toString();
                        Double d_tagetbalance = Double.parseDouble(u_tagetbalance);
                        Double d_bala = Double.parseDouble(str_balance);
                        Double send_amount = d_samount + d_tagetbalance;
                        Double d_deduct = d_bala - d_samount;
                        target_name.setText(u_name);
                        amount.setText(str_amount);
                        //update sender data
                        mDatabaseUsers.child(userID).child("balance").setValue(d_deduct);
                        mDatabaseUsers.child(userID).child("transactions").push().child("trans").setValue(str_amount + " - " + str_posttime + " - " + "C2C" + " - " + "Sent");

                        //post data transfer
                        mDatabaseUsers.child(str_c2c).child("balance").setValue(send_amount);
                        //for user transactions list
                        mDatabaseUsers.child(str_c2c).child("transactions").push().child("trans").setValue(str_amount + " - " + str_posttime + " - " + "C2C"  + " - " + "Received");
                        //confirm success
                        Toast.makeText(Transfer.this, "Sent successfully!", Toast.LENGTH_SHORT).show();
                        Intent sbs = new Intent(Transfer.this, MainActivity.class);
                        startActivity(sbs);
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        target_name.setText("Your target user was not found!");
                        target_name.setTextColor(Color.RED);
                    }
                });

            }

        }else {
            c2c.setError("C2C cant be empty!");
            samount.setError("Enter amount!");
        }
    }

当我通过单击提交按钮发送数据时,我想为我发布的每一个数据创建一个唯一的 ID。在那个id里面有一个叫trans的孩子,

好的,数据实际上是发布到firebase,但我的问题是:当我推送数据时,在创建数据字段(id)时,它正在创建多个数据字段,每个字段都有其唯一的id。我的意思是:我的应用程序冻结并且数据不断发布,直到我关闭移动数据。我只想发布一个数据,但它正在发布无限数据。

标签: javaandroidfirebase-realtime-database

解决方案


您正在收听mDatabaseUsers.child(str_c2c). 因此,每次在该位置写入数据时,onDataChange都会调用您。

然后在此onDataChange您在 下编写一个新的子节点mDatabaseUsers.child(str_c2c),以便再次触发侦听器。然后在onDataChange你添加另一个子节点,这样再次触发监听器。这是一个无限循环,在您关闭应用程序之前它确实不会停止。

对此的快速解决方法是只读取一次值,方法是使用:

mDatabaseUsers.child(str_c2c).addListenerForSingleValueEvent(....

推荐阅读