为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?
Posted
技术标签:
【中文标题】为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?【英文标题】:Why not all data from FirebaseDatabase reference is getting added in an ArrayList<String>?为什么不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中? 【发布时间】:2017-06-17 16:54:06 【问题描述】:我正在从特定的 FirebaseDatabase
引用中检索一些数据并尝试将其添加到 ArrayList<String>
但发生了一些奇怪的事情,因为它们没有一个接一个地添加。
onCreate()
某处:
pA = new ArrayList<>();
这是我的代码:
aRef.child(reID).addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
if (dataSnapshot.getValue() != null)
for (DataSnapshot childSnapshot: dataSnapshot.getChildren())
Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
if (pA != null)
pA.clear();
pA.add(map.get("pA"));
Log.d("pA", String.valueOf(pA));
else
Toast.makeText(getBaseContext(), "no data available yet", Toast.LENGTH_SHORT).show();
@Override
public void onCancelled(DatabaseError databaseError)
);
这是数据结构:
-app
-child
-reID
-uniqueID1
-userID1
-key: value
-key: value
-pA: value1
-uniqueID2
-userID2
-key: value
-key: value
-pA: value2
-uniqueID3
-userID3
-key: value
-key: value
-pA: value3
以下是注销的内容:
D/pA: [value1]
D/pA: [value2]
D/pA: [value3]
我尝试删除 if (pA != null) pA.clear();
,但后来我得到了这个日志:
D/pA: [value1, value1, value2, value1, value2, value3]
我想要的是这样的:
D/pA: [value1, value2, value3]
请让我知道这里出了什么问题,我怎样才能达到上述给定的结果?
【问题讨论】:
您的代码中的数组列表在哪里?什么是 pA? @MrunalAhirraopA
是数组列表。请查看更新后的问题。
@cricket_007 请帮助解决这个问题
您是否尝试过在for
循环之前(移出)if (pA != null)pA.clear();
?
【参考方案1】:
值侦听器在 Firebase 中的工作方式,尤其是您使用它的方式,如果将子节点添加到您正在侦听的节点,您将再次收到所有子节点。这就是如果你不清除数组列表,你会得到 value1, value1, value2, value1, value2, value3 的原因。首先添加 value1,然后当 value2 添加到 firebase 时,您的侦听器会收到一个包含两者的对象。
此方法在附加侦听器时触发一次,并且在每次数据(包括子项)发生更改时再次触发。事件回调被传递一个快照,其中包含该位置的所有数据,包括子数据。 Firebase Documentation
解决方案
在不更改太多代码的情况下解决此问题的最简单方法是在 for 循环之外清除 pA。这样,您将在每次事件触发时获得所有当前存在的 'pA':s。
if (dataSnapshot.getValue() != null)
if (pA != null)
pA.clear();
for (DataSnapshot childSnapshot: dataSnapshot.getChildren())
.
.
.
【讨论】:
以上是关于为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?的主要内容,如果未能解决你的问题,请参考以下文章
为啥不将 Mybatis 集成到 quarkus 系统中呢?
为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?
为啥@WebMvcTest 不将 Controller-Advices 加载到 Application-Context 中?