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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:25:19