You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio+Java开发社交APP:评论被新评论覆盖问题求助

问题修复方案

问题根源

  1. 初始化PostsRef时错误调用push(),导致所有评论被存入同一个随机生成的节点下,而非comments节点下的独立条目
  2. 自定义的RandomKey存在重复风险(同一用户同一分钟内发评论会生成相同Key),引发新评论覆盖旧评论
  3. 按钮点击事件中使用addValueEventListener会持续监听用户数据变化,可能导致重复提交

1. 修正数据库引用初始化

移除PostsRef末尾的push(),让它直接指向当前帖子的comments节点:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_comments);

    Post_key = getIntent().getExtras().get("PostKey").toString();
    // 移除末尾的push(),直接指向comments节点
    PostsRef = FirebaseDatabase.getInstance().getReference().child("Posts").child(Post_key).child("comments");

    mAuth = FirebaseAuth.getInstance();
    current_user_id = mAuth.getCurrentUser().getUid();

    UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");

    CommentsList = findViewById(R.id.comments_list);
    CommentsList.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    CommentsList.setLayoutManager(linearLayoutManager);
}

2. 替换评论ID生成方式(推荐Firebase原生push())

用Firebase的push()生成全局唯一评论ID,彻底避免Key重复覆盖问题:

private void ValidateComment(String userName) {
    String commentText = CommentInputText.getText().toString();

    if(TextUtils.isEmpty(commentText))
    {
        Toast.makeText(this,"Please write text to comment...",Toast.LENGTH_LONG).show();
    }
    else
    {
        Calendar callForDate = Calendar.getInstance();
        SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
        final String saveCurrentDate = currentDate.format(callForDate.getTime());

        Calendar callForTime = Calendar.getInstance();
        SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
        final String saveCurrentTime = currentTime.format(callForTime.getTime());

        // 用Firebase push()生成唯一评论节点
        DatabaseReference newCommentRef = PostsRef.push();
        HashMap commentsMap = new HashMap();
        commentsMap.put("uid",current_user_id);
        commentsMap.put("comment",commentText);
        commentsMap.put("date",saveCurrentDate);
        commentsMap.put("time",saveCurrentTime);
        commentsMap.put("username",userName);

        // 用setValue直接写入评论数据
        newCommentRef.setValue(commentsMap).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful())
                {
                    Toast.makeText(CommentsActivity.this,"comment posted successfully....",Toast.LENGTH_LONG).show();
                }
                else
                {
                    Toast.makeText(CommentsActivity.this,"Error Occured, Try Again...",Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

3. 优化用户数据监听方式

将addValueEventListener改为addListenerForSingleValueEvent,只获取一次用户信息,避免重复触发提交:

PostCommentButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 用addListenerForSingleValueEvent替代addValueEventListener
        UsersRef.child(current_user_id).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.exists())
                {
                    String userName = snapshot.child("username").getValue().toString();
                    ValidateComment(userName);
                    CommentInputText.setText("");
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
    }
});

内容的提问来源于stack exchange,提问作者Anand Puranik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:00:27