gpt4 book ai didi

android - 如何从 Firestore 云数据库读取文档中的 ArrayLists?

转载 作者:行者123 更新时间:2023-11-29 02:31:22 24 4
gpt4 key购买 nike

我正在尝试使用 firestore 构建一个餐厅应用来存储订单和用户。

我尝试了两种方法,第一种是将订单的 ArrayList 作为数组写入 firestore 数据库中,但之后无法读取它们...我使用了 DocumentSnapshot.toObject(myclassoflist.class) 但这只适用于文档中没有数组列表,只有 values = ".."

然后我创建了一个文档集合(每个文档都是一个项目),其中包含作为简单值的数组要了解这一点,请查看我的数据库 enter image description here

然后,为了阅读它们,我首先获取所有文档 ID

        db.collection("orders").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {

documentsIDs.add(document.getId());

}
Integer allIdsD = task.getResult().size();

if (allIdsD.equals(documentsIDs.size())) {
readDocs();
}
}
}
});

然后对于每个文档 ID,我又创建了 3 个 db.collection(collection).get() 以获取子集合中每个文档的内部,再次使用函数 DocumentSnapshot.toObject(myclass.class).

这里的问题是需要大约 0.8 秒才能从数据库中获取完整的订单,考虑到每天可能有 100 多个订单,这已经很多了

My project on GITHUB

示例来自:LimatexMM/app/src/main/java/g3org3/limatexmm/orders.java

编辑:我也试着写命令如下:

    orderListBig docData = new orderListBig(list, currentUser, adList, docId);

(list是ArrayList,currentUser,adList是对象)

    db.collection("orderss").document(docId).set(docData)

然后阅读:

        db.collection("orderss").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {

orderListBig ahah = document.toObject(orderListBig.class);

allOrders.add(ahah); (ArrayList of ordersListBig)

enter image description here

我的订单文件的一部分 enter image description here

最佳答案

根据 official documentation关于在 Cloud Firestore 中使用数组,您需要知道:

Although Cloud Firestore can store arrays, it does not support querying array members or updating single array elements.

如果您只想获取整个 orderList 数组并获取值,比方说 itemMore,您需要获取该特定文档的引用,然后迭代在像这样的 Map 上:

Map<String, Object> map = documentSnapshot.getData();
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getKey().equals("itemMore")) {
Log.d("TAG", entry.getValue().toString());
}
}

但是请注意,即使 orderList 对象作为数组存储在数据库中,entry.getValue() 返回的也是一个 ArrayList,而不是一个数组

对于您的用例,我更好的方法是,如果您考虑这种替代数据库结构,其中每个项目都是映射中的键并且所有值都为真:

orderList: {
"itemMore": true,
"itemMoreValue": true,
"itemMoreOtherValue": true
}

英国电影学院! ;)

关于android - 如何从 Firestore 云数据库读取文档中的 ArrayLists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49465668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com