为啥不将 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&lt;String&gt; 但发生了一些奇怪的事情,因为它们没有一个接一个地添加。

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? @MrunalAhirrao pA 是数组列表。请查看更新后的问题。 @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 系统中呢?

为啥不将其添加到数据库中?

为啥 sscanf() 不将 CSV 文件中的行读入数组?

为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?

为啥不将数据库查询中的移动结果推送到变量中?

为啥@WebMvcTest 不将 Controller-Advices 加载到 Application-Context 中?