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

时间:2018-03-24 14:12:50

标签: android firebase firebase-realtime-database google-cloud-firestore

我正在尝试使用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);

(列表是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

1 个答案:

答案 0 :(得分:0)

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

  

虽然Cloud Firestore可以存储数组, it does not support 查询数组成员或更新单个数组元素。

如果您只想获取整个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,而不是array

我更好地处理您的用例,如果您考虑这种替代数据库结构,其中每个项目都是地图中的关键,并且所有值都为真:

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

BAFTA! ;)