如何从 Firebase 实时数据库中检索特定数据?
Posted
技术标签:
【中文标题】如何从 Firebase 实时数据库中检索特定数据?【英文标题】:How to retrieve Specific Data from Firebase Realtime Database? 【发布时间】:2021-08-22 05:47:34 【问题描述】:我一直在尝试从 Firebase 实时数据库中检索数据,但出现了问题。
Here is the screenshot of database
我想检索“CS102”节点下的所有问题(问题1,问题2等)数据并将其存储在arraylist中。 我尝试了以下几种方式:
reference = FirebaseDatabase.getInstance().getReference().child("CreateQuizQuestions").child(code);
reference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot)
if(snapshot.exists())
for(DataSnapshot ds:snapshot.getChildren())
String QuizName=ds.child("QuizName").getValue().toString();
String TotalQuestions=ds.child("TotalQuestions").getValue().toString();
String ques=ds.child("Question").getValue().toString();
String option1=ds.child("Option1").getValue().toString();
String option2=ds.child("Option2").getValue().toString();
String option3=ds.child("Option3").getValue().toString();
String option4=ds.child("Option4").getValue().toString();
String correctAnswer=ds.child("CorrectAnswer").getValue().toString();
GetQuestion getQuestion=new GetQuestion(ques,option1,option2,option3,option4,correctAnswer);
list.add(getQuestion);
Log.d("Data Values: ","Question:"+list.get(0).question+" Option1: "+list.get(0).option1);
Log.d("Inner Size Tag","Size of list: "+list.size());
else
Toast.makeText(getApplicationContext(),"No Data",Toast.LENGTH_SHORT).show();
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error)
);
但有些地方出了问题 请帮助我找到解决方案
【问题讨论】:
Question, Question1...里面有什么?是只需要节点的键还是里面的数据? 您正在尝试获取“Question1”、“Question2”等的数据。但是您必须获取“Question1”、“Question2”中名为“QuizName”和“总问题” 【参考方案1】:这样,您应该能够收集所有“问题1”节点的信息。您必须为每个“Question2”、“Question3”节点执行此操作。例如,如果“Question2”节点具有不同的子节点,则您不必使用相同数量的变量来检索数据。当然,您必须添加另一个事件侦听器,因为数据库引用会有所不同。如果您的其他问题孩子有相同数量的孩子(答案、选项 1、2、3、4 和问题),您可以使用我之前向您展示过的 for
循环。希望这对你有用!!!
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("CreateQuizQuestions").child("CS102").child("Question1");
ref.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot)
if(snapshot.exists())
String answer=snapshot.child("Answer").getValue().toString();
String op1=snapshot.child("Option1").getValue().toString();
String op2=snapshot.child("Option2").getValue().toString();
String op3=snapshot.child("Option3").getValue().toString();
String op4=snapshot.child("Option4").getValue().toString();
String q=snapshot.child("Question").getValue().toString();
//GetQuestion getQuestion=new GetQuestion(ques,option1,option2,option3,option4,correctAnswer);
//list.add(getQuestion);
//Log.d("Data Values: ","Question:"+list.get(0).question+" Option1: "+list.get(0).option1);
//Log.d("Inner Size Tag","Size of list: "+list.size());
else
Toast.makeText(getApplicationContext(),"No data",Toast.LENGTH_SHORT).show();
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error)
);
【讨论】:
仍然无法正常工作,出现错误:“java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on an null object reference "就行了:String QuizName=ds.child("QuizName").getValue().toString(); 可能找不到节点...你能分享数据库的图片或分享.json吗?我认为问题出在 DatabaseReference 上 现在你的数据库看起来不一样了,那个节点“代码”是新的,所以现在要阅读一个特定的问题,你可以使用它,我将编辑问题1的答案 我想将“Question1”中的所有数据存储在一个对象中,然后将该对象添加到数组列表中,同样适用于剩下的问题 我编辑了答案,现在试试。但是要按照你说的做,你必须创建一个与firebase上的问题具有相同属性的模型并将其保存到它的对象中,然后你就可以在带有@987654323的arraylist上尽可能多地保存对象@loop 我之前已经给你看了以上是关于如何从 Firebase 实时数据库中检索特定数据?的主要内容,如果未能解决你的问题,请参考以下文章