从 firebase 数据库显示给 FirebaseRecyclerAdapter 时出错
Error when showing to FirebaseRecyclerAdapter from firebase database
我正在尝试将我的 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;
}
}
当我 运行 这个 activity 。我得到这个错误
com.google.firebase.database.DatabaseException: Found two getters or
fields with conflicting case sensitivity for property: alamat
我的结构
我该如何解决这个问题?
在您的数据库中,您有 属性: alamat
小写。但是在模型 class 中,您有大写的字段 Alamat
,两者应该相同。
更改模型中的字段class:
public String alamat;
public String getAlamat() {
return alamat;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
您需要确保数据库中 JSON 的 属性 名称与您的 Java class 的名称完全匹配。现在你的 BiodataModel
class 有一个 (JavaBean) 属性 alamat
,而数据库包含一个 (JSON) 属性 Alamat
。由于第一个字符的大小写不同,Firebase 在从数据库读取数据时无法在您的对象上找到匹配的 属性。
正如 Peter 所展示的,最简单的解决方法是在数据库和代码之间保持完全相同的大小写。另一种方法是使用 JSON 属性:
的正确 spelling/casing 注释您的 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:
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;
}
我正在尝试将我的 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;
}
}
当我 运行 这个 activity 。我得到这个错误
com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: alamat
我的结构
我该如何解决这个问题?
在您的数据库中,您有 属性: alamat
小写。但是在模型 class 中,您有大写的字段 Alamat
,两者应该相同。
更改模型中的字段class:
public String alamat;
public String getAlamat() {
return alamat;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
您需要确保数据库中 JSON 的 属性 名称与您的 Java class 的名称完全匹配。现在你的 BiodataModel
class 有一个 (JavaBean) 属性 alamat
,而数据库包含一个 (JSON) 属性 Alamat
。由于第一个字符的大小写不同,Firebase 在从数据库读取数据时无法在您的对象上找到匹配的 属性。
正如 Peter 所展示的,最简单的解决方法是在数据库和代码之间保持完全相同的大小写。另一种方法是使用 JSON 属性:
的正确 spelling/casing 注释您的 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:
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;
}