无法从 Firebase 读取用户数据
Posted
技术标签:
【中文标题】无法从 Firebase 读取用户数据【英文标题】:Can't read user data from Firebase 【发布时间】:2021-12-05 13:55:31 【问题描述】:我正在使用 Firebase 用 Java 开发一个 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 读取用户数据的主要内容,如果未能解决你的问题,请参考以下文章
从 Stripe OAuth Redirect-URI(Stripe OAuth、Firebase 后端、React 前端)读取返回的数据