如何从Firebase删除记录?自动生成键的含义及删除方法
关于Firebase实时数据库自动生成键及删除记录的说明
一、自动生成键的含义
你在截图里看到的长串随机字符,是Firebase通过push()方法生成的唯一记录ID,核心作用是:
- 基于时间戳生成,确保每条记录的键全局唯一
- 自带时间排序属性,记录会按创建顺序排列
- 避免多用户同时写入时出现键冲突的问题
二、你的代码问题(导致键不匹配的原因)
看你上传数据的代码,存在一个关键错误:你先调用reference.push().getKey()获取了postid,但写入数据时又调用了一次reference.push().setValue(...)——这会生成两个完全不同的push ID:一个被存在了postid字段里,另一个才是数据库中实际记录的键,这也是你找不到对应关系的根本原因。
正确写法应该只调用一次push(),保存对应的引用:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("poll_post").child(firebaseUser.getUid()); HashMap<String, Object> hashMap = new HashMap<>(); // 只调用一次push,获取引用和对应键 DatabaseReference newPostRef = reference.push(); String postid = newPostRef.getKey(); hashMap.put("postid", postid); hashMap.put("time_post", ServerValue.TIMESTAMP); hashMap.put("stopcomment", checked); hashMap.put("tv_question", addcomment.getText().toString()); hashMap.put("tvoption1", Answer1.getText().toString()); hashMap.put("tvoption2", Answer2.getText().toString()); hashMap.put("vote1","0"); hashMap.put("vote2", "0"); hashMap.put("publisher", FirebaseAuth.getInstance().getCurrentUser().getUid()); // 用之前保存的引用写入数据 newPostRef.setValue(hashMap, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError != null) { Toast.makeText(Write_poll.this, "Error", Toast.LENGTH_SHORT).show(); myLoadingButton.showErrorButton(); } else { myLoadingButton.showDoneButton(); finish(); } } });
三、删除目标记录的方法
方法1:直接通过记录键删除(最高效)
找到截图里目标记录的长串键,直接定位后调用removeValue():
// 替换成你要删除的记录的实际键 String targetPostKey = "截图中的随机长串键"; DatabaseReference deleteRef = FirebaseDatabase.getInstance() .getReference("poll_post") .child(firebaseUser.getUid()) .child(targetPostKey); deleteRef.removeValue(new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError == null) { Toast.makeText(Write_poll.this, "删除成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(Write_poll.this, "删除失败:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } } });
方法2:通过字段查询删除(适合不知道键的情况)
如果不知道记录键,但知道记录中的某个唯一字段(比如tv_question或修正后的postid),可以先查询定位再删除:
// 替换成目标记录的唯一字段值,比如具体的问题内容 String targetQuestion = "要删除的投票问题内容"; DatabaseReference userPostsRef = FirebaseDatabase.getInstance() .getReference("poll_post") .child(firebaseUser.getUid()); userPostsRef.orderByChild("tv_question").equalTo(targetQuestion).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { postSnapshot.getRef().removeValue(); } Toast.makeText(Write_poll.this, "删除完成", Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(Write_poll.this, "查询失败:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } });
内容的提问来源于stack exchange,提问作者samer
相关产品推荐
相关产品推荐

