Android Studio+Java开发社交APP:评论被新评论覆盖问题求助
问题修复方案
问题根源
- 初始化
PostsRef时错误调用push(),导致所有评论被存入同一个随机生成的节点下,而非comments节点下的独立条目 - 自定义的
RandomKey存在重复风险(同一用户同一分钟内发评论会生成相同Key),引发新评论覆盖旧评论 - 按钮点击事件中使用
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
相关产品推荐
相关产品推荐

