Android双Activity从Firebase实时数据库读取数据失败求助
解决Firebase Realtime Database在LandProfileActivity无法读取数据的问题
嘿,我仔细看了你遇到的问题,咱们一步步来排查和解决:
1. 先修复致命的代码结构错误
你把fetchLandData方法直接嵌套在onCreate方法内部了——Java不允许方法嵌套定义!这会导致这个方法根本无法被正常调用,甚至可能编译报错。你需要把这个方法移到onCreate外面,作为Activity的成员方法,同时别忘了在onCreate里调用它:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_land_profile); mAuth = FirebaseAuth.getInstance(); mUser = mAuth.getCurrentUser(); mDBase = FirebaseDatabase.getInstance(); nama_lahan = (TextView) findViewById(R.id.nama_lahan); lebar_lahan = (TextView) findViewById(R.id.lebar_lahan); panjang_lahan = (TextView) findViewById(R.id.panjang_lahan); luas_lahan = (TextView) findViewById(R.id.luas_lahan); jenis_lahan = (TextView) findViewById(R.id.jenis_lahan); jenis_pupuk = (TextView) findViewById(R.id.jenis_pupuk); // 调用数据获取方法,先判断用户是否已登录 if(mUser != null) { fetchLandData(mUser.getUid()); } else { Toast.makeText(this, "用户未登录,请先登录", Toast.LENGTH_SHORT).show(); } } // 把方法移到onCreate外部 public void fetchLandData(String userUID){ mAkun = mDBase.getReference("Akun").child(userUID); mAkun.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { for(DataSnapshot landData : dataSnapshot.getChildren()){ Lahan lahan = landData.getValue(Lahan.class); if(lahan != null){ namaLahan = lahan.getNamaLahan(); jns_lahan = lahan.getJenisLahan(); jns_pupuk = lahan.getJenisPupuk(); lebarLahan = lahan.getLebarLahan(); panjangLahan = lahan.getPanjangLahan(); luasLahan = panjangLahan*lebarLahan; nama_lahan.setText(namaLahan); jenis_pupuk.setText(jns_pupuk); jenis_lahan.setText(jns_lahan); lebar_lahan.setText(String.valueOf(lebarLahan)); panjang_lahan.setText(String.valueOf(panjangLahan)); luas_lahan.setText(String.valueOf(luasLahan)); }else{ Toast.makeText(LandProfileActivity.this, "Gak iso pisan bos", Toast.LENGTH_SHORT).show(); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 必须添加错误处理!否则永远不知道读取失败的原因 Toast.makeText(LandProfileActivity.this, "读取数据失败:" + databaseError.getMessage(), Toast.LENGTH_LONG).show(); } }); }
2. 检查Firebase数据结构与Lahan类的匹配度
Firebase解析实体类有严格的规则,你需要确保:
Akun/{userUID}下的子节点字段名(包括大小写)和Lahan类的属性完全一致(比如数据库里是namaLahan,类里也要是namaLahan,不能写成nama_lahan)Lahan类必须有无参构造函数,且每个属性都有对应的getter方法,Firebase依赖这些来完成数据解析
3. 验证Firebase数据库权限
确保你的数据库规则允许当前登录用户读取自己的数据,比如设置如下规则:
{ "rules": { "Akun": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
4. 关于Logcat里的ActivityTrigger错误
这个是系统层面的白名单提示,和你读取Firebase数据的问题完全无关,不用在意它。
内容的提问来源于stack exchange,提问作者John Owen
相关产品推荐
相关产品推荐

