Firebase android 计数孩子并将其存储在变量中

Par*_*war 2 android count firebase firebase-realtime-database

在我的应用程序中,我可以通过 datasnapshot.getchildren() 来计算孩子的数量。但是如果我想将该计数存储在一个变量中,我该怎么办?

mRefReg.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(dataSnapshot.getKey(),dataSnapshot.getChildrenCount()+"Count");

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
Run Code Online (Sandbox Code Playgroud)

包括“mCount = dataSnapshot.getChildren”似乎不起作用。

Fra*_*len 7

您所看到的可能是来自 Firebase 的数据是异步加载的。第一次遇到这种情况时,这是一个很大的范式转变。但由于大多数现代云 API 都以这种方式工作,因此最好尽快接受它。

我发现的最简单的方法是查看当我们放置一些日志语句时会发生什么:

System.out.println("Before adding listener");
mRefReg.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("In onDataChange");
    }
    public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After adding listener");
Run Code Online (Sandbox Code Playgroud)

与您的直觉告诉您的相反,它的输出将是:

添加监听器之前

添加监听器后

在 onDataChange

这样做的原因是(正如我在开始时所说的)Firebase 从数据库异步获取数据。了解原因的一种有趣方式是更改您的数据(例如在Firebase 数据库控制台中)。当您进行此更改时,onDataChange将再次调用并打印另一个:

在 onDataChange

不幸的是,这意味着您无法执行以下操作来处理子项计数:

int count = -1;
System.out.println("Before adding listener, count="+count);
mRefReg.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        count = dataSnapshot.getChildrenCount();
        System.out.println("In onDataChange, count="+count);
    }
    public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After adding listener, count="+count);
Run Code Online (Sandbox Code Playgroud)

因为输出将是:

添加监听器之前:count=-1

添加监听器后:count=-1

在 onDataChange: count=3 (假设你有 3 个孩子)

我发现处理这种异步加载的最佳技巧是重新定义问题。与其说“首先我们得到计数,然后我们用它做 xyz”,不如试着把它写成“每当我们得到计数时,用它做 xyz”。这意味着您需要将需要计数的代码移动 onDataChange()

mRefReg.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        int count = dataSnapshot.getChildrenCount();
        // TODO: show the count in the UI
    }
    public void onCancelled(DatabaseError databaseError) { }
});
Run Code Online (Sandbox Code Playgroud)

如果您像这样实现它,每当数据库中的项目数量发生变化时,UI 中的计数就会更新。


归档时间:

查看次数:

11743 次

最近记录:

5 年,5 月 前