我使用FirebaseRecyclerAdapter使用名为“Spacecraft”的Model类获取“Pro”的所有孩子,现在我想将所有候选者检索到Pro的子项中,如“1”
我在“Spacecraft”中创建了一个公共静态“候选人”,我使用了setter和getter但仍然是同样的错误
这是我的数据库:
这是Model Class
public class Spacecraft{
private String name;
private String desc;
private String last;
private candidat candidat;
public Spacecraft.candidat getCandidat() {
return candidat;
}
public void setCandidat(Spacecraft.candidat candidat) {
this.candidat = candidat;
}
public Spacecraft() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
public static class candidat{
private String info;
private String namecandid;
public candidat(){}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getNamecandid() {
return namecandid;
}
public void setNamecandid(String namecandid) {
this.namecandid = namecandid;
}
}
}
这是我的FirebaseRecyclerAdapter代码
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerAdapter<Spacecraft, candidatviewholder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Spacecraft, candidatviewholder>(
Spacecraft.class,
R.layout.candidat,
candidatviewholder.class,
query){
@Override
protected void populateViewHolder(candidatviewholder viewHolder, Spacecraft model, int position) {
viewHolder.setName1(model.getCandidat().getNamecandid());
viewHolder.setInfo1(model.getCandidat().getInfo());
}
};
rv.setAdapter(firebaseRecyclerAdapter);
}
错误:
com.example.ilyas.evotingapplication.Spacecraft $ candidat
上没有找到key1的setter / field
答案 0 :(得分:3)
我有这个错误,但上述解决方案没有修复它。希望这种替代解决方案能够帮助其他人。如果几乎每个变量都出现错误,很可能是你启用了Proguard并且它正在删除未使用的getter和setter方法。要解决此问题,请在proguard-rules.pro文件中添加与此类似的行:
-keep class com.example.yourapp.ObjectClass
其中ObjectClass是存储到Firebase的java对象类的名称。
答案 1 :(得分:1)
我认为只是Firebase和Java上的数据模型不同。
在您的java类中,Spacecraft
类的candidat
字段类型为Candidat
。但是,在数据库中,candidat
字段实际上是一个嵌套对象(map),包含一个键Key1
,其值为Candidat
结构。
所以,取决于你想要达到的目标:
{info: "info 1", namecandid: "name 1"}
直接直接保存在candidat
字段下,而不是更深层次,所以该字段的代码中包含Candidat
类型。private Candidat candidat
字段,则应该键入Map<String, Candidat>
,因为这是它在数据库屏幕截图中的类型。答案 2 :(得分:0)
为我工作: - keepclassmembers 类com.myPackageName.MyClassName {*; }