Firebase 数据库无法将数据检索到 class(returns 空)

Firebase database cant retrieve data into class (returns null)

一直在看教程和论坛,什么都试过了,还是找不到解决办法。当我使用 getValue() 检索数据并将其放入对象时,它会看到这些值,但是当我尝试使用 getValue(Kontaktas.class) 访问 class 时,这些值为空。我做错了什么?

主要

    package com.juliusj.gym.easy;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    DatabaseReference mRef, mIn;
    List<Kontaktas> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mList = new ArrayList<>();
        mRef = FirebaseDatabase.getInstance().getReference();
        //mRef = FirebaseDatabase.getInstance().getReferenceFromUrl("https://easy-683ba.firebaseio.com/users");
        mIn = mRef.child("users");
        mIn.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                //shake hands
                for (DataSnapshot unit : dataSnapshot.getChildren()){
                    Kontaktas value = unit.getValue(Kontaktas.class);
                    mList.add(value);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }
}

Kontaktas.java

    package com.juliusj.gym.easy;

public class Kontaktas {
    private String vardas;
    private String telefonas;

    public Kontaktas()
    {}

    public Kontaktas(String vardas, String telefonas){
        this.vardas = vardas;
        this.telefonas = telefonas;
    }

    public String getVardas() { return vardas; }

    public void setVardas(String vardas) {
        this.vardas = vardas;
    }

    public String getTelefonas() {
        return telefonas;
    }

    public void setTelefonas(String telefonas) {
        this.telefonas = telefonas;
    }
}

我首先看到的错误是,您数据库中的字段与模型 class 中的字段不同!在您的数据库中,您的 Telefonas 字段是大写 T,而在您的模型 class 中,您的 telefonas 是小写 t。两个字段必须相同。您要么更改数据库中的密钥,要么更改模型 class。但我建议您删除实际数据并使用您的模型添加新数据 class 这是正确的。

此外,如果您尝试在 onDataChange() 方法之外打印 mList ArrayList 的值,您将得到一个空列表。这是因为 onDataChange() 方法具有异步行为。要解决此问题,请使用以下代码:

mIn.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Kontaktas> mList = new ArrayList<>();
        for (DataSnapshot unit : dataSnapshot.getChildren()){
            Kontaktas value = unit.getValue(Kontaktas.class);
            mList.add(value);
        }
        Log.d("TAG", mList);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

如果您想在 onDataChange() 方法之外使用 mList,您需要创建自己的回调,为此我建议您查看我的答案的最后一部分 .