gpt4 book ai didi

android - Firebase android 计数 child 并将其存储在变量中

转载 作者:行者123 更新时间:2023-12-05 00:10:01 25 4
gpt4 key购买 nike

在我的应用程序中,我可以通过 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) {

}
});

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

最佳答案

您所看到的很可能是来自 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");

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

Before adding listener

After adding listener

In onDataChange

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

In 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);

因为输出将是:

Before adding listener: count=-1

After adding listener: count=-1

In onDataChange: count=3 (assuming you have 3 children)

我发现处理这种异步加载的最佳技巧是重构问题。与其说“首先我们得到计数,然后我们用它做 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) { }
});

如果您这样实现,只要数据库中的项目数发生变化,UI 中的计数就会更新。

关于android - Firebase android 计数 child 并将其存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41163512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com