该程序需要验证我的 firebase 数据库中是否存在某些内容

发布于 2025-01-11 23:32:52 字数 1111 浏览 0 评论 0原文

我的问题是我需要单击按钮两次才能执行 ValueEventListener。第一次在没有验证的情况下进入另一个活动并工作时,我需要按模拟器中的返回按钮,然后再次按搜索按钮(意图按钮)。

search.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {

                    for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {

                        if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
                            x++;
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

        Intent intent = new Intent(MainActivity.this,Image.class);
        intent.putExtra("x",String.valueOf(x));
        startActivity(intent);
    }
});
 

My problem is that i need to click twice on my button to execute the ValueEventListener. The first time it goes to another activity without the verification and to work i need to press the return button in emulator and then press again on the search button(intent button).

search.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {

                    for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {

                        if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
                            x++;
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });

        Intent intent = new Intent(MainActivity.this,Image.class);
        intent.putExtra("x",String.valueOf(x));
        startActivity(intent);
    }
});
 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

二智少女猫性小仙女 2025-01-18 23:32:52

问题在于对 Firebase(以及大多数云 API)的调用是异步的,它们允许您的主代码在后台加载数据时继续运行。然后,一旦数据可用,您的 onDataChange 就会被调用。

实际上,这意味着您的 intent.putExtra("x",String.valueOf(x));x++ 被调用之前运行良好,您可以最轻松地验证这一点通过在调试器中运行,或放置一些日志语句。

解决方案是,所有需要数据库数据的代码都必须位于 onDataChange 内部,从那里调用,或者以其他方式同步。所以最简单的修复:

databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {

for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {

if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
x++;
}
}
//

The problem is that calls to Firebase (and most cloud APIs) are asynchronous, and they allow your main code to continue while loading the data in the background. Then once the data is available, your onDataChange is called.

In practice this means that your intent.putExtra("x",String.valueOf(x)); runs well before x++ ever gets called, something you can most easily verify by running the in a debugger, or placing some log statements.

The solution for this is that all code that needs the data from the database must be inside onDataChange, be called from there, or be otherwise synchronized. So the simplest fix:

databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {

            for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i++) {

                if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
                    x++;
                }
            }
            // ????
            Intent intent = new Intent(MainActivity.this,Image.class);
            intent.putExtra("x",String.valueOf(x));
            startActivity(intent);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException(); // ???? Also: never ignore errors
    }
});

Also see:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文