提问者:小点点

Firebase push()方法连续创建多个键


我正在尝试在按钮单击的子项中创建一个随机键,并在该键中插入数据

但当我点击这个按钮时,它会创建多个具有相同数据的键,并且一直持续到我在后台关闭应用程序为止

上面的问题是在postreview()方法中,在我的代码中,我在按钮clcik上调用这个方法

  
    public class DisplayStory extends AppCompatActivity {
    TextView Tittle;
    WebView webView;
    String story;
    String storyname;
    String catagory;
    String TAG = "display";
    DatabaseReference storyref;
    DatabaseReference ratingref;
    RatingObject ratingObject;
    // review stuff
    RatingBar user_ratingBar;
    EditText comment_EditText;
    EditText senderName_editText;
    Button submit;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_story);
        Tittle = findViewById(R.id.TITLE);
        webView = findViewById(R.id.webview);
        // review stuff
        user_ratingBar = findViewById(R.id.ratings_to_submit);
        comment_EditText = findViewById(R.id.comment_to_submit);
        senderName_editText = findViewById(R.id.sender_name);
        submit = findViewById(R.id.submit_btn);

        storyname = getIntent().getStringExtra("tittle");
        catagory = getIntent().getStringExtra("catagory");

        Log.d(TAG,"storyname "+storyname);
        Log.d(TAG,"storyname "+catagory);

        Tittle.setText(storyname);
        storyref = FirebaseDatabase.getInstance().getReference(catagory).child(storyname);
        ratingref = FirebaseDatabase.getInstance().getReference(catagory).child(storyname).child("rating");
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PostReview();
            }
        });


        storyref.child("story").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){
                    story = dataSnapshot.getValue().toString();
                    webView.loadData(story,"text/html", "UTF-8");
                    webView.getSettings().setBuiltInZoomControls(true);
                    webView.getSettings().setDisplayZoomControls(false);
                    Log.d(TAG,"story exist ");
                    Log.d(TAG,"story "+story);

                }
                else {
                    Log.d(TAG,"no story exist ");

                }



            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });




    }

    public void PostReview(){
        final String name,comment;
        final float rating;
        name = senderName_editText.getText().toString();
        comment = comment_EditText.getText().toString();
        rating = user_ratingBar.getRating();
        ratingref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 ratingObject =
                        new RatingObject(name,comment,rating);
                ratingref.push().setValue(ratingObject);



            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }

}


共1个答案

匿名用户

就我所见,不需要在PostReView方法中附加侦听器,因为您不使用DataSnapShot中的任何数据。

所以在这种情况下,代码可以简单得多:

public void PostReview(){
    final String name,comment;
    final float rating;
    name = senderName_editText.getText().toString();
    comment = comment_EditText.getText().toString();
    rating = user_ratingBar.getRating();
    ratingObject = new RatingObject(name,comment,rating);
    ratingref.push().setValue(ratingObject);
}

这还将解决无止境循环,该循环是由于调用添加了AddValueEventListener的侦听器的OnDataChange内部的SetValue而导致的。 有关更详细的解释,请参见:

  • 更改Firebase中的值将导致无限循环
  • 将数据插入到firebase-Android-并检查特定属性