从firebase数据库向FirebaseRecyclerAdapter显示时出错

时间:2018-05-02 10:48:09

标签: java android firebase firebase-realtime-database firebaseui

我正在尝试将Firebase数据库中的数据显示给RecylerView,我正在按照本教程official Unity tutorials

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.biodatalist_layout);
        ButterKnife.bind(this);

        recyclerView = findViewById(R.id.rec);

        LinearLayoutManager horizontalLayoutManagaer=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(horizontalLayoutManagaer);

        mdatabase = FirebaseDatabase.getInstance().getReference().child("Biodata");
        mdatabase.keepSynced(true);

        FirebaseRecyclerAdapter<BiodataModel, BiodataAdapter> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<BiodataModel, BiodataAdapter>(
                        BiodataModel.class,
                        R.layout.biodata_list_row,
                        BiodataAdapter.class,
                        mdatabase
                )
                {
                    @Override
                    protected void populateViewHolder(final BiodataAdapter viewHolder,final BiodataModel model,
                                                      int position) {
                        viewHolder.setEmailtext(model.getEmail());
                        viewHolder.setFullnametext(model.getFullname());

                    }

                };

        recyclerView.setAdapter(firebaseRecyclerAdapter);
    }

和我的BiodataModel

public class BiodataModel {

    public String Fullname,Email,NoTelp,Alamat;

    public BiodataModel() {

    }

    public String getFullname() {
        return Fullname;
    }

    public String getEmail() {
        return Email;
    }

    public String getNoTelp() {
        return NoTelp;
    }

    public String getAlamat() {
        return Alamat;
    }

    public void setFullname(String Fullname) {
        this.Fullname = Fullname;
    }

    public void setEmail(String Email) {
        this.Email = Email;
    }

    public void setNoTelp(String NoTelp) {
        this.NoTelp = NoTelp;
    }

    public void setAlamat(String Alamat) {
        this.Alamat = Alamat;
    }
}

当我运行此活动时。我收到此错误

  

com.google.firebase.database.DatabaseException:找到两个getter或者   属性的区分大小写的字段:alamat

我的结构

http://www.programmingviral.com/firebase-recyclerview-tutorial/

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在您的数据库中,您拥有小写的alamat属性。但是在模型类中,您使用大写字段Alamat,两者都应该相同。

更改模型类中的字段:

public String alamat;

public String getAlamat() {
    return alamat;
}

public void setAlamat(String alamat) {
    this.alamat = alamat;
}

答案 1 :(得分:0)

您需要确保数据库中JSON的属性名称与Java类的属性名称完全匹配。现在,您的BiodataModel类具有(JavaBean)属性alamat,而数据库包含(JSON)属性Alamat。由于第一个字符的大小写不同,Firebase在从数据库读取数据时无法在对象上找到匹配的属性。

正如Peter所示,最简单的解决方法是在数据库和代码之间保持完全相同的情况。另一种方法是使用JSON属性的正确拼写/大小写来注释Java代码:

public class BiodataModel {

    public String Fullname,Email,NoTelp,Alamat;

    public BiodataModel() {

    }

    @PropertyName("Fullname")
    public String getFullname() {
        return Fullname;
    }

    @PropertyName("Email")
    public String getEmail() {
        return Email;
    }

    @PropertyName("NoTelp")
    public String getNoTelp() {
        return NoTelp;
    }

    @PropertyName("Alamat")
    public String getAlamat() {
        return Alamat;
    }

    @PropertyName("Fullname")
    public void setFullname(String Fullname) {
        this.Fullname = Fullname;
    }

    @PropertyName("Email")
    public void setEmail(String Email) {
        this.Email = Email;
    }

    @PropertyName("NoTelp")
    public void setNoTelp(String NoTelp) {
        this.NoTelp = NoTelp;
    }

    @PropertyName("Alamat")
    public void setAlamat(String Alamat) {
        this.Alamat = Alamat;
    }
}

请注意getter和setter是可选的,并且似乎在这里添加不多。由于您的字段已经公开,您还可以使用这个更短的类:

public class BiodataModel {
    public String Fullname;
    public String Email;
    public String NoTelp;
    public String Alamat;
}

由于此处的字段名称已经与JSON属性名称精确匹配,因此您无需对其进行注释。但是如果你在这里遇到不匹配的问题,你可以只注释该字段以使事情再次发挥作用。例如:

public class BiodataModel {
    @PropertyName("FullName")
    public String Fullname;
    public String Email;
    public String NoTelp;
    public String Alamat;
}