当前位置: 首页 > 知识库问答 >
问题:

Firestore未从文档中检索某些字段

盖斌
2023-03-14

我在片段中有一个回收器来显示firestore中集合中的文档,问题是,它只从文档中检索某些字段,看起来它忽略了模型类中的其他一些Setter字段,这是我得到的错误:

W/Firestore:(0.6.6-dev)[zzko]:在com类中找不到sabado的setter/field。实例denilsondasilva。iasdmt。com。实例denilsondasilva。com。实例denilsondasilva。型号。模型程序AS

现在这是我的模型类:

public class ModelProgramas {

    public ModelProgramas() {
    }

    public ModelProgramas(String sabado, String evento, String responsavel, String data, String horario) {
        this.sabado = sabado;
        this.evento = evento;
        this.responsavel = responsavel;
        this.data = data;
        this.horario = horario;
    }

    public String getSabado() {
        return sabado;
    }

    public void setSabado(String sabado) {
        this.sabado = sabado;
    }

    public String getEvento() {
        return evento;
    }

    public void setEvento(String evento) {
        this.evento = evento;
    }

    public String getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(String responsavel) {
        this.responsavel = responsavel;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getHorario() {
        return horario;
    }

    public void setHorario(String horario) {
        this.horario = horario;
    }

    private String sabado;
    private String evento;
    private String responsavel;
    private String data;
    private String horario;
}

我为类创建了一个空构造函数,为变量创建了构造函数,还创建了getter和setter,我看到了前面的问题,所以我知道getter和setter以及变量都是正确创建的。变量小写,getter和setter以大写开头。firestore文档中的字符串与创建的变量相同

这是我的适配器:

public class PROGRAMASrecyclerAdapter extends RecyclerView.Adapter<PROGRAMASrecyclerAdapter.Programasholder> {

    Context ctx;
    private List<ModelProgramas> Progs_list;

    public PROGRAMASrecyclerAdapter(List<ModelProgramas> progs_list) {
        this.Progs_list = progs_list;
    }

    @NonNull
    @Override
    public Programasholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ctx = parent.getContext();
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.programas_list_item,parent,false);
        return new Programasholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Programasholder holder, int position) {

        final String sabado = Progs_list.get(position).getSabado();
        holder.setSabado(sabado);

        String evento = Progs_list.get(position).getEvento();
        holder.setEvento(evento);

        String responsavel = Progs_list.get(position).getResponsavel();
        holder.setResponsavel(responsavel);

        String data = Progs_list.get(position).getData();
        holder.setData(data);

        String horario = Progs_list.get(position).getHorario();
        holder.setHorario(horario);

        holder.mcardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ctx, sabado, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return Progs_list.size();
    }

    public class Programasholder extends RecyclerView.ViewHolder{
        View mView;
        private TextView Sabadotxt;
        private TextView Eventotxt;
        private TextView Responsaveltxt;
        private TextView DatadoEventotxt;
        private TextView Horariotxt;
        private CardView mcardView;

        public Programasholder(View itemView) {
            super(itemView);
            mView = itemView;

            mcardView = mView.findViewById(R.id.listCard_Programas);
        }

        public void setSabado(String sabado){
            Sabadotxt = mView.findViewById(R.id.Prog_sabadotxt);
            Sabadotxt.setText(sabado);
        }

        public void setEvento(String evento){
            Eventotxt = mView.findViewById(R.id.Prog_eventotxt);
            Eventotxt.setText(evento);
        }

        public void setResponsavel(String responsavel){
            Responsaveltxt = mView.findViewById(R.id.Prog_responsaveltxt);
            Responsaveltxt.setText(responsavel);
        }

        public void setData(String data){
            DatadoEventotxt = mView.findViewById(R.id.Prog_datadoEventotxt);
            DatadoEventotxt.setText(data);
        }

        public void setHorario(String horario){
            Horariotxt = mView.findViewById(R.id.Prog_horariotxt);
            Horariotxt.setText(horario);
        }
    }
}

我甚至在cardview上创建了一个点击监听器来显示检索到的字符串“sabado”,以查看问题是否出在Viewholder类上,但它返回NULL

这是我的片段类:

public class ProgramasFragment extends Fragment {

    View view;
    private RecyclerView recyclerView;
    private List<ModelProgramas> Progs_List;
    private FirebaseFirestore firebaseFirestore;
    PROGRAMASrecyclerAdapter programaSrecyclerAdapter;


    public ProgramasFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_programas, container, false);
        Progs_List = new ArrayList<>();
        programaSrecyclerAdapter = new PROGRAMASrecyclerAdapter(Progs_List);

        firebaseFirestore = FirebaseFirestore.getInstance();

        recyclerView = view.findViewById(R.id.Recycler_ProgramasList);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(programaSrecyclerAdapter);

        firebaseFirestore.collection("programasdatarde").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

                if (queryDocumentSnapshots == null){
                    String error = e.getCause().getMessage();
                    Toast.makeText(getActivity().getApplicationContext(), "Empty QUERY: "+error, Toast.LENGTH_SHORT).show();
                }else{

                    for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()){

                        if (doc.getType() == DocumentChange.Type.ADDED){

                            ModelProgramas modelProgramas = doc.getDocument().toObject(ModelProgramas.class);
                            Progs_List.add(modelProgramas);
                            programaSrecyclerAdapter.notifyDataSetChanged();
                        }
                    }
                }
            }
        });

        return view;
    }
}

我知道问题不在fragment类或适配器中,我的意思是,我认为,因为我已经一遍又一遍地审查了它们,我还有其他带有recyclerviews的片段,它们执行相同的函数,它们不会出现这种错误。

请不要将此标记为重复问题,因为我已经在其他相关帖子上找到了所有其他解决方案,但这并不能解决我的错误!请帮忙。

数据结构是这样的。

共有1个答案

程城
2023-03-14

我在您的代码中发现了一个错误和一些改进,如下所示。

删除回收视图。setHasFixedSize(真) 。因为您的回收视图是动态加载的,并且您可能没有每个元素的固定高度。

不要在for循环内调用notifyDataSetChanged。这样做吧。

firebaseFirestore.collection("programasdatarde").addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

        if (queryDocumentSnapshots == null){
            String error = e.getCause().getMessage();
            Toast.makeText(getActivity().getApplicationContext(), "Empty QUERY: "+error, Toast.LENGTH_SHORT).show();
        } else {
            for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()){
                if (doc.getType() == DocumentChange.Type.ADDED){
                    ModelProgramas modelProgramas = doc.getDocument().toObject(ModelProgramas.class);
                    Progs_List.add(modelProgramas);
                }
            }

            // Move the notify data set out here. 
            programaSrecyclerAdapter.notifyDataSetChanged();
        }
    }
});

现在简化模型类。我认为您不需要显式的getter和setter。只需将变量声明为public即可。然而,能手和二传手都不错。我在那里找不到任何错误。

public class ModelProgramas {

    public String sabado;
    public String evento;
    public String responsavel;
    public String data;
    public String horario;

    public ModelProgramas() {}
}

请进行更改并检查错误是否仍然存在。但是,我没有发现适配器和模型类有任何问题。我在这里提出的建议是将notifyDataSetChanged移出循环,并从循环视图中删除setHasFixedSize属性。

 类似资料:
  • 我的mongodb中有一个收藏,如下所示 我要做的是根据优先级的值(如我应该得到的)获取字段

  • 我在firestore数据库中有两个集合,第一个是所有文档的列表(BlockList),第二个是用户的。当用户书签在应用程序的RecycerView上发布时,将文档的id和时间戳发送到Users Collection下的子Collection(收藏夹)。 我从主集合(BlockList)中检索基于此ID的文档列表,但我希望根据每个用户的时间戳来排列它们,所以我尝试在将它们添加到Arraylist并

  • 我希望在我的社交应用程序中实现朋友搜索功能。为此,我尝试在DB的“用户”集合中查询每个用户的文档,但它应该排除一些特定文档,例如当前用户已经是朋友的用户或请求待定的用户。 是否可以通过在Firestore中传递这些文档引用ID来查询所有用户文档,不包括特定文档。 如果没有,有人能说一种结构化数据的方法,以便我可以实现这个功能吗?谢谢。

  • 我计划将文档中地图字段的子字段的值用于其他目的,但似乎无法检索它。我在这个网站上找到了一个答案,但是得到值的解决方案代码对我来说太多了。我可以使用解决方案代码来获得值,但如果有最简单的方法来获得它,请在这里删除答案。 这是Firestore DB的截图,我需要在一个以UID作为字段名的map字段中获得deleted的布尔值:

  • 我如何删除一个特定的文档中的一个集合在fiRecovery使用反应? 我在这里和谷歌上看了看,但我没有发现任何内在相关的东西。 我只是设法从我的集合中删除索引[0]的文档。 这状态idDoc接收所有id文档。 如果我只是传递. doc(idDoc),我会得到以下错误: Firebase Error: Function Collection Reference.doc()要求它的第一个参数是非空字符

  • 我正在使用Apache Commons FTPClient从FTP服务器获取文件。以下是设置: 这是传输代码: 我在日志中看到: 所有php文件都已同步,所有xml文件都无法同步。FTP服务器在我的本地笔记本上(Mac OS X默认FTP服务器,tnftpd 20100324 GSSAPI) 为什么它不工作?