【问题标题】:Error when showing to FirebaseRecyclerAdapter from firebase database从 firebase 数据库向 FirebaseRecyclerAdapter 显示时出错
【发布时间】:2018-10-12 10:55:03
【问题描述】:

我正在尝试将我的 Firebase 数据库中的数据显示到 RecylerView,我正在学习本教程 http://www.programmingviral.com/firebase-recyclerview-tutorial/

 @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

我的结构

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    在您的数据库中,您有属性:alamat,带有小写字母。但是在模型类中,Alamat 字段是大写的,两者应该是一样的。

    更改模型类中的字段:

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

    【讨论】:

    • 请检查我更新的问题。我正在添加图片
    • 是的,你需要使用小写alamat,所有其他字段也应该是小写
    • 嗯,你哪里知道我有小写的alamat
    • 我是新手。对不起
    • 你不需要,但你需要遵循 javabean 约定,它是有小写的字段。所以像 firstName, alamat 以避免这个错误..也在这里检查:stackoverflow.com/questions/37801036/…
    【解决方案2】:

    您需要确保数据库中 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多