Firebase 数据库一次又一次地更新子值,而不满足编码 true



在我的应用程序中有一个推荐选项,如果推荐代码匹配,我正在使用 firebase 数据库更新钱包,但问题是用户帐户已成功信任,但代理帐户(被引用(多次信任,例如一遍又一遍地连续,这就是问题所在,

public void checkreffercode() {
    final String refferalcode = editText.getText().toString();
    if (refferalcode.equals("")) {
        Toast.makeText(ReferalActivity.this, "Refferal code is empty", Toast.LENGTH_LONG).show();

    } else {
        final DatabaseReference reffercoderef = FirebaseDatabase.getInstance().getReference().child("Reffercode");
        final DatabaseReference agentwallet = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference userwalletstat = FirebaseDatabase.getInstance().getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Refferal");
        final DatabaseReference userwallet = FirebaseDatabase.getInstance().getReference(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("walletcoin");
        userwalletstat.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String statous = dataSnapshot.getValue(String.class);
                if (statous == null) {
                    Toast.makeText(ReferalActivity.this, "data is null in Refferal", Toast.LENGTH_LONG).show();

                } else if (statous.equals("notcredited")) {
                    //here check all the feild....
                    reffercoderef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.child(refferalcode).exists()) {
                                final String Uid = dataSnapshot.child(refferalcode).getValue(String.class);
                                userwallet.setValue(String.valueOf(5000));
                                agentwallet.child(Uid).child("walletcoin").addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {

                                        String agentbalance = dataSnapshot.getValue(String.class);
                                        Integer agentbalinint = Integer.parseInt(agentbalance);
                                        Integer updatedbalu = (agentbalinint + 5000);
                                        agentwallet.child(Uid).child("walletcoin").setValue(String.valueOf(updatedbalu));
                                        userwalletstat.setValue("credited");
                                    }
                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {
                                        Toast.makeText(ReferalActivity.this, "error on updating agent balance", Toast.LENGTH_LONG).show();

                                    }
                                });

                            } else {
                                Toast.makeText(ReferalActivity.this, "Refferal code not found", Toast.LENGTH_LONG).show();

                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Toast.makeText(ReferalActivity.this, "Database error on checking refferal code", Toast.LENGTH_LONG).show();

                        }
                    });

                    //last
                } else {

                    Toast.makeText(ReferalActivity.this, "Both wallet has been credited", Toast.LENGTH_LONG).show();

                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(ReferalActivity.this, "Database error on checking account status", Toast.LENGTH_LONG).show();

            }
        });

    }

}
public void updateref(View view) {
    Button button=findViewById(R.id.refbutton);
    final ProgressDialog progressDialog = new ProgressDialog(ReferalActivity.this);
    progressDialog.setMessage("Please wait..");
    progressDialog.getActionBar();
    progressDialog.setCancelable(false);
    progressDialog.show();
    checkreffercode();
    progressDialog.cancel();
}

这是我的 xml 代码

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Refer code"
android:id="@+id/refercode"
android:inputType="textPersonName"
android:padding="20dp"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Update"
    android:onClick="updateref"
    android:layout_gravity="center"
    android:id="@+id/refbutton"
    android:textColor="#51122e"/>

您正在userwalletstat引用中使用ValueEventListener。问题是,对于ValueEventListener就是这样,每次在userwalletstat("引用"(子级下更改值时都会调用它。在 else if (statous.equals("notcredited"))条件中,您正在使用另一种ValueEventListener,在该中,您正在设置如下值userwallet.setValue(String.valueOf(5000));

因此,您的第一个 ValueEventListener 被激活,因为它是一个ValueEventListener。所以你的代码有点像一个回避函数,它很糟糕。因此,为了修复它,您应该将ValueEventListeners替换为 SingleValueEventListener .您可以在此处了解有关它们的更多信息,然后向下滚动到一次读取数据部分。

基本上,您需要更换

userwalletstat.addValueEventListener(new ValueEventListener() {

userwalletstat.addListenerForSingleValueEvent(new ValueEventListener() {

并对其他侦听器执行相同的操作,例如:

reffercoderef.addListenerForSingleValueEvent(new ValueEventListener() {

agentwallet.child(Uid).child("walletcoin").addListenerForSingleValueEvent(new ValueEventListener() {

另外,我不知道您的数据结构是如何设置的,但是在侦听器中有一个侦听器并不是一个好主意。也许你应该重新组织你的数据结构。

最新更新