首页 > 解决方案 > 使用firestore在for循环中设置布尔值仅适用于列表中的一个对象

问题描述

使用安卓工作室。用java写的。使用火力基地。我有一个具有布尔变量的对象的 ArrayList。

在firestore中,我在一个集合中有多个文档,这些文档具有userid和objectid,我成功地查询了带有firebase用户和对象id的文档。然后,我继续将 ArrayList 中每个对象的布尔值设置为 true,尽管布尔值仅适用于等于最终返回文档的对象。调试对象时确实设置为true,然后除了最后一个之外,它们都恢复为false?有人可以解释为什么我的布尔值会这样吗?

MyObject Class;

private boolean giftBagged;

public boolean getObjectBagged() { return objectBagged; }
public void setObjectBagged(boolean objectBagged) { this.objectBagged = 
objectBagged; }

在我的主要活动中。我在这个类的其他地方初始化了我的 ArrayList。它充满了我的一些对象。

  database.collection("UserObjectCollection")
                .whereEqualTo("userID", firebaseUser)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                for (int i = 0; i < objectList.size(); i++) {
                                    MyObject obj = objectList.get(i);
                                    if (obj.getDocID() == document.getLong("objID").intValue()) {
                                        obj.setObjectBagged(true);
                                    } else {
                                        obj.setObjectBagged(false);
                                    }
                                }
                            }
                            mcb.onSuccess();
                        }
                    }
                });

没有错误信息。经过调试,它们确实设置为 true,但当列表在其他地方使用时,除了最后一个迭代之外,所有这些都恢复为 false。

如果需要更多信息,请告诉我。

标签: javaandroidarraylistgoogle-cloud-firestoreboolean

解决方案


看起来你在一个循环中循环。您没有处理表明您已找到该值的条件,因此假设您位于 10 的第 5 个元素处,并且它与另一个数组中的 10 个元素的第 7 个匹配。它将继续循环,因此下一次循环时,它将重置为 false,因为 10 中的第 8 个元素不匹配。

最好将所有 objectBagged 设置为 false(在创建对象时默认设置?),然后删除循环的“else”条件,仅在找到时才将其设置为 true。

您还可以为 docID 的 if 测试添加一个条件,如果它在之前的通道中设置为“true”,也可以防止它返回“false”。

还有更多方法,但这两种方法相当简单。


推荐阅读