-1

一直在看教程和论坛,尝试了所有方法,仍然找不到解决方案。当我使用 getValue() 检索数据并将其放入对象中时,它会看到这些值,但是当我尝试使用 getValue(Kontaktas.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;
    }
}

数据库PIC

调试器日志

4

1 回答 1

2

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

此外,如果您尝试mList在方法之外打印 ArrayList的值onDataChange(),您将得到一个空列表。这是因为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) {}
});

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

于 2018-02-14T12:44:30.343 回答