Android Java环境下Firebase Realtime Database orderByChild(timeStamp)不生效问题
Firebase Realtime Database orderByChild按时间戳查询无结果问题排查
orderByChild()完全可以穿透push生成的随机键子节点匹配目标字段:该方法的作用是对当前参考节点下所有直接子节点的指定字段进行排序/匹配,和子节点的键名无关,你之前用postKey作为查询条件可以正常运行就是最好的证明,这部分逻辑没有问题。
核心问题:查询值类型不匹配
你数据库中存储的timeStamp是数字类型(long),但你在equalTo()中传入的是加了双引号的字符串类型"1635677993574",Firebase Realtime Database的查询是严格类型校验的,数字和字符串即使字面量完全一致也会被判定为不相等,因此查询不到任何匹配数据。
修复方案
把beginDelete()方法中equalTo的入参改为数字类型即可:
private void beginDelete() { DatabaseReference db = FirebaseDatabase.getInstance().getReference(); // 去掉引号,传入long类型的时间戳 Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo(1635677993574L); // 如果你是要删除当前打开的帖子,不要写死时间戳,直接取页面传递的参数即可: // long currentPostTime = getIntent().getExtras().getLong("postDate"); // Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo(currentPostTime); queryByTimestamp.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() { @Override public void onComplete(@NonNull Task<DataSnapshot> task) { if(task.isSuccessful()){ for (DataSnapshot ds : task.getResult().getChildren()){ ds.getRef().removeValue(); Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show(); } } else{ Log.d("TAG",task.getException().getMessage()); Toast.makeText(PostDetailActivity.this,"게시글이 삭제안되었습니다.",Toast.LENGTH_SHORT).show(); } } }); }
额外建议
如果后续数据量变大,你需要在Firebase Realtime Database的安全规则中为Posts节点添加索引,提升查询效率:
{ "rules": { "Posts": { ".indexOn": "timeStamp" } } }
内容的提问来源于stack exchange,提问作者Eye Lamp
相关产品推荐
相关产品推荐

