从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?

Posted

技术标签:

【中文标题】从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?【英文标题】:Retrieve a nested object from Firestore and put into RecycleView in Android? 【发布时间】:2020-04-26 15:22:42 【问题描述】:

我正在尝试在单个文档中使用附加的图像数据结构填充 android 中的 RecylerView。我想列出每个 ID 的每个名称、地区、图像。

它需要在不破坏子集合的情况下完成。是否有任何可能的智能方法来填充RecylerView。谢谢

这是我正在使用的示例数据。 [![在此处输入图片描述][1]][1]

编辑 1: 我尝试实现以下,它有效吗?

private void setUpRecyclerView(View view) 

        CheckinList = new ArrayList<>();
        notebookRef.get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>()

            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) 

                for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) 
                    user user = documentSnapshot.toObject(user.class);

                    HashMap<String, HashMap> about = user.getAbout();
                    for(Map.Entry<String, HashMap> entry : about.entrySet()) 
                        String key = entry.getKey();
                        HashMap<String, HashMap> value = entry.getValue();
                        String Name = "";
                        String District = "";
                        String imageUrl = "";
                        for (Map.Entry<String, HashMap> entry3 : value.entrySet()) 
                            String key3 = entry3.getKey();
                            if (key3 == "name")
                                Name = entry3.getValue().toString();
                             else if (key3 == "district")
                                District = entry3.getValue().toString();
                             else if (key3 == "imageurl") 
                                imageUrl = entry3.getValue().toString();
                            
                        
                        CheckinList.add(new Checkin(Name, District, imageUrl));

                        

                    

                

        );

        adapter = new NoteAdapter(CheckinList, mContext);

        RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
        recyclerView.setAdapter(adapter);
    ```

full data scheme screenshot
[![enter image description here][2]][2]


  [1]: https://i.stack.imgur.com/2Jspj.jpg
  [2]: https://i.stack.imgur.com/iwsat.jpg

【问题讨论】:

到目前为止你尝试过什么?请同时添加您的数据库的另一个屏幕截图以查看您的根集合。 添加了屏幕截图。我只有一个根集合。但只是带有嵌套对象的文档。我要查询最底层的嵌套地图对象 很抱歉,我看到的截图和以前一样。可以查一下吗? 抱歉,拖错了图片。更新 【参考方案1】:

如果ID个数不大,则需要嵌套for循环

如果您可以访问数据库,则应该将架构更改为类似的内容

Document(randomID) -> Collection (about) -> Document (IDs) = Data (name/district/image);

在此之后,您可以简单地进行嵌套 Firebase 查询来访问数据。

如果您在使用我给定架构的 Firebase 查询方面需要帮助,或者您想使用自己的架构并获取数据,请提供更多信息。

编辑 1

不建议,因为这不是获取数据的最佳方式

FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();

firebaseFirestore
    .collection("your collection")
    .document("your doc).get()
    .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() 
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) 
        if (task.isSuccessful())
            int docSize = 10; //size of IDs (assuming 10)
            for (int index = 0; index <= docSize; index++)
                HashMap<String, Object> dataMap = (HashMap<String, Object>) task.getResult().get("1000000"+index);
                //you have data in dataMap
            
        
    
);

抱歉,由于我没有完整的信息,所以不确定结果,您需要修改代码。如果成功,请编辑我的答案。

仍然建议更改架构

希望这会有所帮助!

【讨论】:

感谢您的回复。对于嵌套的for循环,我是否需要在hashmap上创建一个for循环,然后为内部hashmap创建另一个循环?之后,我将结果哈希图添加/转换为数组列表。最后,我将数组列表放入 recyclerview 适配器以填充它。我的理解正确吗? 尝试在 Firebase 中实现您的架构后这是不可行的,您可以更改您的 Firestore 结构吗?它没有遵循正确的 JSON 格式,您应该使用我的建议或与您的架构/结构类似的东西 谢谢。我只是想知道,我想我可以在实时数据库中做到这一点。实时数据库可以嵌套多层。就像一个聊天室应用程序。我认为它在 Firestore 中应该是相似的。如果我误解了这部分,请纠正我。 在实时数据库中,您不必自己创建另一个集合,但在这里您必须完成该部分。 Collection(mainCollection) -&gt;Document(randomID) -&gt; Collection (about) -&gt; Document (IDs) = Data (name/district/image); 这是您在 firebase 中必须做的事情才能获得相同的结果。这可能看起来像一些额外的步骤,但这是为了更好 我通过制作情侣循环进行了试验。它会起作用吗?参考:***.com/questions/4234985/how-to-for-each-the-hashmap

以上是关于从 Firestore 中检索嵌套对象并放入 Android 中的 RecyclerView?的主要内容,如果未能解决你的问题,请参考以下文章

从 Firestore 中检索文档引用的值

在 AngularFire 中检索嵌套 Firestore 查询的 RxJS Observable

如何从 Cloud Firestore 上的对象中检索值?迅速

Firestore - 嵌套查询

Flutter Firestore:从 Firestore 中检索数据并在 Flutter 中显示为小部件

Flutter - 如何从 Firestore 中检索 ID 列表并在 GridView 中显示它们的项目?