Я пытаюсь показать данные из моей базы данных 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: Found two getters or fields with conflicting case sensitivity for property: alamat
моя структура
Как я могу это решить?
В вашей базе данных есть свойство: alamat
в нижнем регистре. Но в классе модели у вас есть поле Alamat
с прописными буквами, оба должны быть одинаковыми.
Измените поле в классе модели:
public String alamat;
public String getAlamat() {
return alamat;
}
public void setAlamat(String alamat) {
this.alamat = alamat;
}
да, вам нужно использовать аламат в нижнем регистре, и все остальные поля также должны быть в нижнем регистре
Хм, откуда ты знаешь, что у меня строчный alamat
?
Я новичок в этом. Простите
вы этого не сделаете, но вам нужно следовать соглашению javabean и иметь поля в нижнем регистре. так что, как firstName, alamat, чтобы избежать этой ошибки .. также проверьте это здесь: stackoverflow.com/questions/37801036/…
пожалуйста, проголосуйте за ответ, так как он вам помог, спасибо!
я получаю это предупреждение No setter/field for NoTelp found on class id.co.id.co.aaaa.BiodataModel (fields/setters are case sensitive!)
Позвольте нам продолжить обсуждение в чате.
Вам необходимо убедиться, что имена свойств JSON в базе данных и вашего класса Java точно совпадают. Прямо сейчас ваш класс BiodataModel
имеет свойство (JavaBean) alamat
, а база данных содержит свойство (JSON) Alamat
. Поскольку регистр первого символа отличается, Firebase не может найти подходящее свойство для вашего объекта при чтении данных из базы данных.
Как показал Питер, самое простое решение - сохранить один и тот же случай между базой данных и кодом. Альтернативой является аннотирование вашего Java-кода с правильным написанием / регистром свойства JSON:
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;
}
}
Кстати, обратите внимание, что геттеры и сеттеры не являются обязательными и, похоже, не добавляют здесь много. Поскольку ваши поля уже общедоступны, вы также можете использовать этот гораздо более короткий класс:
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;
}
пожалуйста, проверьте мой обновленный вопрос. Я добавляю картинку