如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]
Posted
技术标签:
【中文标题】如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]【英文标题】:How to get all documents from a firestore collection and return them in an array list? [duplicate] 【发布时间】:2019-04-27 17:23:52 【问题描述】:我有一个静态方法可以获取集合中的所有文档。我无法创建要返回的这些文档的数组。我怎么能那样做?让我们将数组列表称为“allItems”。我的方法是将在 for 循环中创建的每个项目添加到 allItems 数组列表中,但是当我返回它并且 android studio 提示我将数组列表设为最终列表时,该列表为空。
public static ArrayList<Item> geAllFromFireStore()
FirebaseFirestore db = FirebaseFirestore.getInstance();
ArrayList<Item> allItems = new ArrayList<>();
db.collection("Items")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task)
if (task.isSuccessful())
for (QueryDocumentSnapshot document : task.getResult())
Log.d(TAG, document.getId() + " => " + document.getData());
String name = document.get("name") + "";
String categoryName = document.get("category") + "";
Item item = new Item(name, category);
// I would like to add these items to an array list and return that array list
else
Log.w(TAG, "Error getting documents.", task.getException());
);
return allItems;
【问题讨论】:
检查一下。 ***.com/questions/48594059/… 这将向调用方法返回一个空列表,仅供参考 【参考方案1】:但是当我返回这个列表时它是空的,并且 android studio 提示我将数组列表设置为最终列表。
将其设为 final 并没有错,鉴于该代码,它不可能返回 null,但很可能是 empty,因为它实际上是在 Firebase 甚至尝试制作遥控器之前返回的数据库查询。
这就是异步的问题——您需要等待结果才能返回它。
例如参数化获取快照的监听器
public static void getAllFromFireStore(OnCompleteListener<QuerySnapshot> listener)
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("Items").get().addOnCompleteListener(listener);
就是这样。
从那里,重构其余代码以传入您已经编写的侦听器,而不是实际期望从方法调用中返回一个对象
API.getAllFromFireStore(new OnCompleteListener<QuerySnapshot>()
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task)
if (task.isSuccessful())
// TODO: get data
);
从里面,你可以填充一个 RecyclerView 适配器,例如
【讨论】:
【参考方案2】:我是用 Kotlin 编写的,所以请在你的代码中修改它。
// Declare variable that use to collect DocumentSnapshot
private lateinit var list: MutableList<DocumentSnapshot>
// In addOnCompleteListener…
if(task.isSuccessful)
lstMAP = mutableListOf<DocumentSnapshot>()
lstMAP.clear()
lstMAP.addAll(task.result!!.documents)
else
Log.d("doc", "0 doc")
【讨论】:
谢谢,不过我无法理解这一点。这将如何让我返回包含文档的数组列表? 我已经编辑了我的代码,所以请再次检查。如果你仍然使用 for-loop,那么在 for-loop 之后返回它。 顺便说一下,使用 allItems 时请小心。因为如果您的 Collection 没有文档,当您从空 arrayList 获取值时,它可能会导致 IndexOutOfBoundsException。 如果有效,请接受我的回答。 谢谢,我已经忘记他的代码已经有return语句了。以上是关于如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?
Firestore - 如何在将文档添加到集合后获取文档 ID