无法从 Firebase 读取用户数据

Posted

技术标签:

【中文标题】无法从 Firebase 读取用户数据【英文标题】:Can't read user data from Firebase 【发布时间】:2021-12-05 13:55:31 【问题描述】:

我正在使用 Firebase 用 Ja​​va 开发一个 android 应用。 该应用程序有 2 个需要用户数据的任务。因此,当我单击第一个按钮时,它可以工作,但是当我重新启动应用程序并单击第二个按钮(相同的代码)时,它不起作用。 app's image

第一个按钮的代码:

if(mAuth.getCurrentUser() == null) 
        accessoFragment.show(getSupportFragmentManager(), accessoFragment.getTag());
    

    if (mAuth.getCurrentUser() != null) 
        prelevaDati();

        getSupportFragmentManager().beginTransaction().
                add(R.id.fragmentContainerView, ProfiloFragment.class, null).commit();

        toolbar.setSubtitle("Profilo");

第二个按钮的代码:

case R.id.buttonScheda:
            if(mAuth.getCurrentUser() == null) 
            accessoFragment.show(getSupportFragmentManager(), accessoFragment.getTag());
        

            if (mAuth.getCurrentUser() != null) 
                prelevaDati();
                toolbar.setSubtitle("SCHEDA");
                child = "Scheda";
             else return;

            break;    

读取数据功能:

public void prelevaDati() 
    mDatabase.child("Utenti").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) 
            utente = snapshot.getValue(Utente.class);
        

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

请帮帮我

感谢@FrankvanPuffelen 更新了问题: 按下第二个按钮后,对象用户为空,因为跳过了 onDataChange 和 onCancelled 函数。因此,当我尝试使用用户方法时,程序停止运行并在控制台中显示 NullPointException:

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.HashMap com.example.app.Utente.getScheda()”

【问题讨论】:

1) 这里的“它不起作用”是什么意思? IE。当您在每一行上设置一个断点,然后在调试器中运行代码时,这是第一行没有按照您的预期执行的操作?该行使用的所有变量是什么? 2) 永远不要将onCancelled 留空,因为您忽略了错误。至少应该是:public void onCancelled(@NonNull DatabaseError databaseError) throw databaseError.toException(); 请编辑您的问题并添加 Frank van Puffelen 要求的信息,并回复@。 @FrankvanPuffelen 问题已更新 我在您共享的代码中没有看到对 getScheda 方法的任何调用。您确定错误来自此代码吗? 错误来自另一个类,但在调试中我看到问题出在侦听器中,因为程序跳过它,我可以看到用户为空。所以我懒得在类中发送一个空对象。 【参考方案1】:

所以我解决了这个问题。

问题是第二个按钮在开关中,所以我不知道为什么,但是 addValueEventListener 在开关中不起作用。所以我将监听器放在 onViewCreated 中的 onClickListener 中(在他的片段中)。

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);

    view.findViewById(R.id.buttonScheda).setOnClickListener(v -> 
        if(mAuth.getCurrentUser() == null) 
            accessoFragment.show(getActivity().getSupportFragmentManager(), accessoFragment.getTag());
        

        if (mAuth.getCurrentUser() != null) 
            mDatabase.child(mAuth.getUid()).addListenerForSingleValueEvent(new ValueEventListener() 
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) 
                    utente = snapshot.getValue(Utente.class);
                    toListaFragment();
                

                @Override
                public void onCancelled(@NonNull DatabaseError error) 
                    Log.d("DatabaseError", error.getDetails());
                
            );
        
    );

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于无法从 Firebase 读取用户数据的主要内容,如果未能解决你的问题,请参考以下文章

使用firebase读取数据以反应本机

使用用户 ID 从 Firebase 获取数据

在 Firebase 数据库中读取和写入数据

在 Firebase 数据库中读取孩子

如何限制从 Firebase 读取数据的速率?

从 Stripe OAuth Redirect-URI(Stripe OAuth、Firebase 后端、React 前端)读取返回的数据