java - 使用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。
如果需要更多信息,请告诉我。
解决方案
看起来你在一个循环中循环。您没有处理表明您已找到该值的条件,因此假设您位于 10 的第 5 个元素处,并且它与另一个数组中的 10 个元素的第 7 个匹配。它将继续循环,因此下一次循环时,它将重置为 false,因为 10 中的第 8 个元素不匹配。
最好将所有 objectBagged 设置为 false(在创建对象时默认设置?),然后删除循环的“else”条件,仅在找到时才将其设置为 true。
您还可以为 docID 的 if 测试添加一个条件,如果它在之前的通道中设置为“true”,也可以防止它返回“false”。
还有更多方法,但这两种方法相当简单。
推荐阅读
- spring - Spring - 使用默认配置进行注释
- nlp - 如何在没有简洁惩罚的情况下计算 BLEU 分数
- ios - 如何创建对象的新实例并将其传递到数组 SwiftUI
- java - 从另一个类调用一个类中的局部变量
- oracle - OCI Ansible 异步收集切换数据库
- node.js - 字符串化为 json 时添加了额外的双引号
- java - 找不到资源/credentials.json
- influxdb - 如何在 InfluxDB 2.0 仪表板上获取查询变量?
- selenium-webdriver - 如何在 selenium 中访问 Firefox 扩展 url
- c# - 模拟 Unity InputSystem 鼠标事件