这是从 Firebase 检索数据的正确方法吗?

Posted

技术标签:

【中文标题】这是从 Firebase 检索数据的正确方法吗?【英文标题】:Is this the correct way to retrieve data from Firebase? 【发布时间】:2020-04-02 16:11:30 【问题描述】:

简介

我正在为学校开发一个应用程序,我选择了 Firebase,因为他们的大量视频和在线资料可以为您提供很多帮助。但是,当您对某项事物不熟悉时,这类问题可以由更有经验的人来解决。

到目前为止我所了解的

我想从 Firebase 的实时数据库中检索一个随机数据对象。我看到其他帖子建议包含在教程视频中的示例,但似乎没有一个适合我:

我有一个数据库,其中包含用户上传的问题,其结构如下:

(忘记为什么它说的是消息而不是问题,因为我一直在按照他们的教程逐行尝试实现我的目标)

为了检索数据,您必须创建对数据库的引用:

//DB Object
private FirebaseDatabase mFirebaseDatabase;
//This will only reference the message part of the DB
private DatabaseReference mQuestionsDBReference;

并将其初始化为:

private void loadQuestionsDB() 
    //Access point
    mFirebaseDatabase = FirebaseDatabase.getInstance(); //Instanciate the object
    mQuestionsDBReference = mFirebaseDatabase.getReference().child("messages"); //Only reference the 
    "messages" part
    //System.out.println("[DEBUG] " + mQuestionsDBReference.getDatabase());

(我在这里初始化了一个函数中的所有内容,稍后由onCreate() 调用)

为了从数据库中选择一个随机问题,我采用了这个解决方案:

private void loadRandomQuestion() 

    mQuestionsDBReference.startAt(randomNumber()).limitToFirst(1).addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 

            if(dataSnapshot.getChildrenCount() > 0) 
                System.out.println("[DEBUG-PLAY] Cargando!");
                for(DataSnapshot dataSnap : dataSnapshot.getChildren())
                    //Something I tried so maybe that was the problem I was facing :(
                    String question = dataSnap.child("-M3qlTuWw9TkD-LwQWYA").child("question").getValue().toString();
                    String answer1 = dataSnap.child("answer1").getValue().toString();
                    String answer2 = dataSnap.child("answer2").getValue().toString();
                    String answer3 = dataSnap.child("answer3").getValue().toString();
                    String answer4 = dataSnap.child("answer4").getValue().toString();

                    questionViewTxt.setText(question);
                    radioButton1.setText(answer1);
                    radioButton2.setText(answer2);
                    radioButton3.setText(answer3);
                    radioButton4.setText(answer4);
                
             else 
                System.out.println("[DEBUG] No children :/, that's a problem right there...");
            
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );

问题和目标

我无法从数据库中成功检索到我需要的随机问题。

目标是能够在我每次按下按钮或调用函数loadRandomQuestion() 时检索一个随机问题。

注意事项

- Instead of System.out.println() I could use Log
   - Instead of the above I could use the debugger
   - I know there are multiple listeners for referencedDB
   - I am at beginner level in this subject (3 days since this post)
   - I'm using Andriod Studio

【问题讨论】:

【参考方案1】:

您的mQuestionsDBReference.startAt(randomNumber()) 不起作用,因为:

    您没有指定订购的依据,因此startAt(randomNumber()) 不会“知道”从哪里开始。 您在 JSON 中没有作为键或属性的相关数字,因此 Firebase 没有可匹配的内容。

您似乎认为startAt() 可以与偏移量一起使用,但事实并非如此。 Firebase startAt()/endAt() 查询是基于游标的,这意味着您需要指定一个值开始。

例如,你可以这样做:

mQuestionsDBReference.orderByKey().startAt("-M3qm...Q2Tz-")...

或从特定问题开始:

mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...

允许随机访问:

    为每个问题添加一个具有可预测值范围的属性。 计算该范围内的随机值。 然后按该属性排序,并从该值开始。

另见:

Firestore: How to get random documents in a collection,适用于 Firestore,但同样的原则适用于实时数据库 Get random child from Firebase Database Firebase - random query How to get a random object from firebase database in android? 更多来自这些search results

【讨论】:

非常感谢您不仅提供答案,还感谢您提供所有文档和视频。您的团队为绝对初学者和小型初创公司创建了一个很棒的工具。 :D【参考方案2】:

我建议将所有问题加载到 ArrayList 中,这样会更容易。 https://firebase.google.com/docs/database/web/read-and-write

希望这对您有所帮助,或者让您了解如何改进代码,如果没有,我很抱歉我帮不上忙!

这是一个类似的问题(已回答)

Get random item from Firebase

【讨论】:

如果有数千个问题怎么办。那会占用很多空间。 有点帮助我,即使这是一个 Java 问题而不是 JS。谢谢老哥! 很高兴能帮上忙!

以上是关于这是从 Firebase 检索数据的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 从 Firebase 检索数据

Recyclerview 不会从 firebase 检索数据

从 Firebase Auto Id 中检索数据 - Firebase Swift

从Firebase本地实时存储Room DB上的数据

我无法从 Firestore Flutter 检索和查看数据

如何从firebase检索多个数据到android中的列表视图?