【问题标题】:No setter/field for found Android Firebase没有找到 Android Firebase 的设置器/字段
【发布时间】:2017-01-14 12:43:33
【问题描述】:

我使用 FirebaseRecyclerAdapter 使用名为“Spacecraft”的模型类获取“Pro”的所有子代,现在我想将所有候选者检索到 Pro 的子代中,例如“1”

我在“Spacecraft”中创建了一个公共静态“候选人”,我使用了 setter 和 getter,但仍然出现同样的错误

这是我的数据库:

这是模型类

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 的设置器/字段

【问题讨论】:

  • 静态类不能有构造函数
  • 我删除了构造函数但仍然是同样的错误:/ @uguboz
  • 不要删除构造函数。从候选类中删除静态。并在 Spacecraft 中通过调用 new candidat() 设置候选人。
  • 没用兄弟:/
  • 嗨@ilyasshabi,尝试将candidat类从Spacecraft的内部类移动到一个独立的类,就像Spacecraft一样,同时删除静态属性。

标签: android firebase firebase-realtime-database pojo


【解决方案1】:

我遇到了这个错误,但上述解决方案没有解决它。希望这个替代解决方案能帮助其他人。如果几乎每个变量都出现该错误,则很可能是您启用了 Proguard 并且它正在删除未使用的 getter 和 setter 方法。要解决此问题,请在您的 proguard-rules.pro 文件中添加与此类似的行:

-keep class com.example.yourapp.ObjectClass

其中 ObjectClass 是存储到 Firebase 的 java 对象类的名称。

【讨论】:

    【解决方案2】:

    我认为只是 Firebase 和 Java 上的数据模型不同。

    在您的 java 类中,Spacecraft 类有一个 candidat 类型为 Candidat 的字段。但是,在数据库中,candidat字段实际上是一个嵌套对象(map),包含一个键Key1,其值是一个Candidat结构。

    所以,取决于你想要达到的目标:

    • 如果您希望每个航天器只有一个候选对象:正确保存数据库对象,因此{info: "info 1", namecandid: "name 1"} 直接保存在candidat 字段下直接,而不是更深一层,因此该字段具有类型Candidat 在代码中。
    • 如果您希望每个航天器都有几个候选对象:而不是 private Candidat candidat 字段,应该输入 Map&lt;String, Candidat&gt;,因为这是它在您的数据库屏幕截图中的类型。

    【讨论】:

    • 嘿,quezak,谢谢你的回答!这是第二种情况;我希望每个 spacecrft 都有一些候选人并将它们填充到 FirebaseRecycler 中;我将此添加到 Spacecraft “私有 Map candidat;”(带有 getter、setter)你能告诉我如何检索这张地图的数据吗?
    • @ilyasshabi 像普通的 Java 映射一样对其进行迭代 :) 请参阅 this answer 以获得简单说明。
    • 我会把它迭代到这个函数 populateViewHolder 中?
    • @ilyasshabi 我自己没有使用回收器适配器,所以只是一般的想法——如果您的查询返回整个航天器,那么在内部迭代候选地图,或者进行一个只返回所有一艘船的候选人,那么你不必处理内部迭代。
    【解决方案3】:

    为我工作: -keepclassmembers 类 com.myPackageName.MyClassName { *; }

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2020-07-15
      • 1970-01-01
      • 2017-01-04
      • 2018-01-24
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多