【问题标题】:Firestore Query not retrieving all items into firestore RecyclerViewFirestore Query 未将所有项目检索到 Firestore RecyclerView
【发布时间】:2020-05-26 15:15:32
【问题描述】:

目前我只从 Cloud Firestore 中检索项目的最大大小 -1,这意味着如果有 3 个项目,它只会检索 2 个。我可以知道我在从 collection().document() 检索项目时做错了什么。收藏()?

这是我在 xml 中保存 RecyclerView 的章节片段

public class ChapterFragment extends Fragment {
    FirebaseFirestore db;
    private RecyclerView recyclerView;
    private View view;
    private Query mQuery;
    private FirestoreRecyclerAdapter adapter;
    private String documentId;

    public ChapterFragment() {

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        db = FirebaseFirestore.getInstance();
        view = inflater.inflate(R.layout.fragment_chapter, container, false);
        recyclerView = view.findViewById(R.id.chapter);
        //Query
            mQuery = db.collection("Book").document("1").collection("1").orderBy("Volume", Query.Direction.DESCENDING);
        //Options
            FirestoreRecyclerOptions<ChapterDetails> options = new FirestoreRecyclerOptions.Builder<ChapterDetails>()
                    .setQuery(mQuery,ChapterDetails.class)
                    .setLifecycleOwner(this)
                    .build();

        //ViewHolder
        adapter = new FirestoreRecyclerAdapter<ChapterDetails, ChapterDetailsViewHolder>(options) {
            @NonNull
            @Override
            public ChapterDetailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view2 = LayoutInflater.from(parent.getContext()).inflate(R.layout.chapter_list, parent , false);
                return new ChapterDetailsViewHolder(view2);
            }

            @Override
            protected void onBindViewHolder(@NonNull ChapterDetailsViewHolder holder, int position, @NonNull ChapterDetails model) {
                holder.volume.setText("volume " + model.getVolume());
                holder.PDF.setText(model.getPDF());
            }
        };

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(adapter);
        return view;
    }

    private class ChapterDetailsViewHolder extends RecyclerView.ViewHolder{

        private TextView volume;
        private TextView PDF;

        public ChapterDetailsViewHolder(@NonNull View itemView) {
            super(itemView);

            volume = itemView.findViewById(R.id.volume_number);
            PDF = itemView.findViewById(R.id.pdf_text);
        }
    }
}

这是我的firestore的图片:

这是我的章节详情

public class ChapterDetails {
    private String Volume,PDF;
    public ChapterDetails(){
        //empty
    }
    public ChapterDetails(String volume, String pdf) {
        Volume = volume;
        PDF = pdf;
    }

    public String getVolume() {
        return Volume;
    }

    public void setVolume(String volume) {
        Volume = volume;
    }

    public String getPDF() {
        return PDF;
    }

    public void setPDF(String PDF) {
        this.PDF = PDF;
    }


}

This is how it looks in the android emulator

2020 年 5 月 28 日编辑:

D/error: get failed with 
    com.google.firebase.firestore.FirebaseFirestoreException: Failed to get document from cache. (However, this document may exist on the server. Run again without setting source to CACHE to attempt to retrieve the document from the server.)
        at com.google.firebase.firestore.core.FirestoreClient.lambda$getDocumentFromLocalCache$9(com.google.firebase:firebase-firestore@@21.4.3:197)
        at com.google.firebase.firestore.core.FirestoreClient$$Lambda$9.then(Unknown Source:0)
        at com.google.android.gms.tasks.zzd.run(Unknown Source:5)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I/TAG: Current value of i = 1
I/TAG: Current value of i = 2
I/TAG: Current value of i = 3
I/TAG: Current value of i = 4
I/TAG: Current value of i = 5
I/TAG: Current value of i = 6

显然,firestore 说我创建了源缓存?我没有

【问题讨论】:

  • 嗨@Alex Mamo 我可以知道这如何回答我的问题吗?
  • 以一种您应该更改字段名称或使用注释的方式。请检查副本。在您的课程中,您应该在数据库中有名为小写的字段。
  • @AlexMamo 我按照帖子所说的做了,并将它们更改为小写字母,但是现在我什至在 recyclerview 中都看不到单个项目
  • @Alex:我做到了:)(我丢失了您的链接,但请随时将其添加到末尾的“另请参阅”列表中)。也就是说,显然 OP 的问题不在于属性名称(不知道这将如何与数据库结构和代码一起使用),而在于项目的数量。但我也看不出它会在哪里跳过更多文档。
  • 有趣的假设 Alex.

标签: java android firebase google-cloud-firestore firebaseui


【解决方案1】:

将 Java 类中的属性映射到 Firestore 数据库中的字段时,Firebase 使用 Java Bean 样式命名约定。

在此约定中,您的 getVolumesetVolume 方法映射到名为 volume 的属性/字段,getPDFsetPDF 映射到名为 pDF 的属性。您会注意到这两个名称都以小写字母开头,而在您的文档中它们以大写字母开头。而且由于这些名称不同,您的班级将永远无法阅读此文档。

您可以通过在 getter 和 setter 上使用 `` 注释来控制属性到字段的映射。像这样的:

public class ChapterDetails {
    private String Volume,PDF;
    public ChapterDetails(){
        //empty
    }
    public ChapterDetails(String volume, String pdf) {
        Volume = volume;
        PDF = pdf;
    }

    @PropertyName("Volume")
    public String getVolume() {
        return Volume;
    }

    @PropertyName("Volume")
    public void setVolume(String volume) {
        Volume = volume;
    }

    @PropertyName("PDF")
    public String getPDF() {
        return PDF;
    }

    @PropertyName("PDF")
    public void setPDF(String PDF) {
        this.PDF = PDF;
    }
}

另见:

【讨论】:

  • 嗨,很抱歉这么说,但我刚试过,它返回了相同的结果 maxsize-1
  • 你看到亚历克斯关于为什么可能的评论了吗? stackoverflow.com/questions/62025436/…
  • 您好,您说的卷可能有不同的名称?如果是这样,我已经检查过了,它的字段都是 Volume
猜你喜欢
  • 2021-09-06
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2020-01-06
相关资源
最近更新 更多