如何从Firebase数据库中仅提取指定节点的Rupees值?
解决Firebase数据库提取指定节点Rupees值到TextView的问题
嘿,我看了你的代码,发现几个小问题导致你没法正确获取Rupees的值,咱们一步步来修正:
问题分析
- 不必要的循环操作:你已经把
d2ref指向了Standard 1st节点,dataSnapshot就是这个节点的完整快照,不需要遍历它的子节点——这会让你重复执行取值逻辑,甚至可能取错值。 - 取值逻辑错误:在循环里你用
dataSnapshot.child("Rupees"),但如果Standard 1st的子节点不止Rupees,这个操作其实是在重复读取同一个值,完全没必要。 - 空指针风险:直接调用
getValue().toString()如果值为null会导致崩溃,得先做非空判断。
修正后的代码
public class Collection extends AppCompatActivity { TextView ttl; Button btnshw; DatabaseReference d2ref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_collection); ttl = findViewById(R.id.texirs); // Android Studio 3.0+无需强转,支持自动类型转换 btnshw = findViewById(R.id.bshow); btnshw.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 确认路径完全匹配Firebase里的节点名称(大小写、空格都不能错) d2ref = FirebaseDatabase.getInstance().getReference() .child("2018-19") .child("Gat No 14") .child("School no 109") .child("Standard 1st"); d2ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 直接从Standard 1st节点下获取Rupees的值 String rupeesValue = dataSnapshot.child("Rupees").getValue(String.class); // 处理空值,避免崩溃 if (rupeesValue != null) { ttl.setText(rupeesValue); Log.d("Tag", "获取到的Rupees值:" + rupeesValue); } else { ttl.setText("未找到Rupees数据"); Log.d("Tag", "Rupees节点不存在或值为null"); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 打印错误信息,方便调试排查问题 Log.e("FirebaseError", "读取数据失败:" + databaseError.getMessage()); } }); } }); } }
额外调试建议
- 检查Firebase数据库规则:确保你的数据库规则允许读取操作,调试阶段可以暂时设置成公开读取(上线后务必改回安全规则):
{ "rules": { ".read": true, ".write": true } } - 确认节点路径完全一致:Firebase的节点名称区分大小写和空格,比如
Gat No 14不能写成gat no 14,一定要和数据库里的节点名称完全匹配。 - 查看Logcat日志:如果还是没数据,看看Logcat里的
Tag和FirebaseError日志,能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Cybertronian
相关产品推荐
相关产品推荐

