Firebase数据库无法将数据检索到类中(返回null)

时间:2018-02-14 12:32:06

标签: android firebase firebase-realtime-database getvalue

一直在观看教程和论坛,尝试了一切,仍然无法找到解决方案。当我使用getValue()检索数据并将其放在对象中时,它会看到值,但是当我尝试使用getValue(Kontaktas.class)的类时,值为null。我做错了什么?

主要

    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;
    }
}

databasePIC

debugerLOG

1 个答案:

答案 0 :(得分:1)

我第一次看到的错误是,您的数据库中的字段和模型类中的字段是不同的!在您的数据库中,您的Telefonas字段为大写T,而在您的模型类中,您的telefonas字段为小t。两个文件必须相同。您可以更改数据库中的键,也可以更改模型类。但我建议您删除实际数据并使用正确的模型类添加新数据。

此外,如果您尝试在mList方法之外打印onDataChange() 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) {}
});

如果您想使用mListonDataChange()方法,则需要创建自己的回调,为此,我建议您从 {{3}查看我的答案的最后一部分}