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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:25:17