如何从 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 实时数据库中检索特定数据?的主要内容,如果未能解决你的问题,请参考以下文章

无法从unity3d中的firebase实时数据库中检索数据

从firebase实时数据库IOS Swift中检索数据

如何从 Firebase 实时数据库中检索/获取项目

如何从 Firebase 实时数据库中检索值?

如何使用颤振从firebase实时检索数据

我如何从颤动的firebase实时数据库中检索数据