如何从Firebase中通过指定子节点值查询同节点的Type字段取值
代码修改方案
你现有代码的核心问题是查询条件使用错误,调整如下即可实现需求:
- 你需要按子节点的
Name字段匹配查询,不能使用orderByValue(),该方法仅适用于节点本身为基础类型(字符串/数字等)的排序查询,当前Category下的每个子节点都是包含Name、Type两个字段的对象,需使用orderByChild("Name")指定匹配字段 - 原有代码硬编码了查询值
"Salary",需要替换为方法传入的sName参数 - Firebase的数据监听是异步回调逻辑,你当前定义的同步返回
String的方法无法直接拿到查询结果,建议通过接口回调传递结果
修正后的代码示例
// 先定义回调接口用于接收异步返回的结果 public interface OnCategoryTypeGotListener { void onGot(String type); void onError(Exception e); } private void GetCategory(String sName, OnCategoryTypeGotListener listener) { DatabaseReference db = FirebaseDatabase.getInstance().getReference("Category"); // 按Name字段匹配传入的sName参数 Query query = db.orderByChild("Name").equalTo(sName); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { String eType = userSnapshot.child("Type").getValue(String.class); Log.d("Category","查询到的Type值:"+ eType); // 回调返回结果 if (listener != null) { listener.onGot(eType); } // 如果Name是唯一值,匹配到之后可以直接终止循环 break; } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { if (listener != null) { listener.onError(databaseError.toException()); } } }); }
调用示例
GetCategory("Salary", new OnCategoryTypeGotListener() { @Override public void onGot(String type) { // 此处可以使用查询到的Type值处理后续逻辑 } @Override public void onError(Exception e) { // 处理查询异常 } });
参考的数据库结构如下:
内容的提问来源于stack exchange,提问作者AV114
相关产品推荐
相关产品推荐

