当前位置: 首页 > 面试题库 >

addChildEventListener(Firebase)中的数组问题

东门修能
2023-03-14
问题内容

Integer scores[] = new Integer[10];
int count = 0;

我有一些要输入的数据array。我将其放在 onChildAdded中 ,但是如果我需要从数组 中获取onChildAdded之外的数据
,控制台将显示 “ null”

如果我尝试将数组的数据放入 onChildAdded中 ,它将成功

data.child("scores").addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        count++;
                        scores[count] = dataSnapshot.getValue(Integer.class);
                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {

                    }

                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

int i = scores[1];

重要时刻

例如,如果我将使用 FOR

for (int i = 0; i < 10; ++i) {
        scores[i] = i;
    }

    int i = scores[3];

不会为空


问题答案:

FirebaseAPI是asynchronous,表示这些方法中的每个方法onChildAdded()onChildChanged()等等,在调用后立即返回,并且它返回的Task的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。因为该方法立即返回,所以scores尚未从回调中填充该数组,这就是为什么为空的原因。

基本上,您尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。

快速解决此问题的方法是移动以下代码行:

for (int i = 0; i < 10; ++i) {
    scores[i] = i;
}
int i = scores[3];

onChildAdded()方法内部,数据可用的位置。

如果您需要循环的score数组回调外,我建议你看我anwser从这个最后的部分
,其中我已经解释了如何可以使用自定义的回调来完成。您也可以观看此
视频 ,以更好地理解。



 类似资料:
  • 我实际上有两个问题彼此相似。我的问题的简要概述如下: 我正在开发的图书馆应用程序与书籍和作者有一对多的关系,这意味着一本书可以有许多作者。一个样本作者和一本书作为图像附上。 Q1.如何搜索特定作者?对于一本只有1个作者的书,它总是有第0个索引。一本有多个作者的书怎么样?如果是这样,相同的作者也可以存在于其他索引中。我想从一个特定的作者那里得到所有的书,我想知道什么是最好的方法?

  • 我是说 现在我可以得到这个房间的孩子了,但是我想知道是否有一种方法可以使用来完成同样的事情。

  • 本章将解释数组在Firebase中如何表示。 参考以几下数据 - 我们可以通过将以下JSON树发送给集合来创建这些数据。 这是因为Firebase不直接支持数组,而是使用整数作为键名创建对象列表。 不使用数组的原因是因为Firebase充当实时数据库,如果有几个用户同时操作数组,结果可能会有问题,因为数组索引不断变化。 Firebase处理数组的方式是:键(索引)将始终保持不变。 我们可以删除jo

  • 在我的情况下,登录应用程序时需要通过UID从realTime Database获取用户配置文件 在文档中必须使用添加值事件通知程序才能从实时数据库读取 //如果我有obj的id,如何直接从实时firebase获取值 //我的问题是,这里不能使用这种方法

  • 我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的

  • 我有一个由N条路径组成的数组,用于从firebase数据库中的不同位置检索数据。