Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是从Firebase检索数据的正确方法吗?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Java 这是从Firebase检索数据的正确方法吗?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,导言 我正在为学校做一个应用程序,我选择了Firebase,因为他们有大量的视频和在线资料,可以帮助你很多。但是,当你对某件事还不熟悉时,这些问题可以在这里由更有经验的人来解决 到目前为止我所了解的 我想从Firebase的实时数据库中检索一个随机数据对象。我曾看到其他帖子建议教程视频中包含的示例,但似乎没有一篇适合我: 我有一个数据库,上面有用户上传的问题,结构如下: (忘了为什么它说的是信息而不是问题,因为我在一行一行地跟随他们的教程,试图实现我的目标) 为了检索数据,您必须创建对数据库的

导言

我正在为学校做一个应用程序,我选择了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()
,都能检索到一个随机问题

注释


我建议将所有问题加载到ArrayList中,这样会更容易

希望这能对您有所帮助,或者给您一个关于如何改进代码的想法,如果没有,那么我很抱歉我帮不上什么忙

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


您的
mQuestionsDBReference.startAt(randomNumber())
无法工作,因为:

  • 您没有指定订购依据,因此
    startAt(randomNumber())
    将无法“知道”从何处开始
  • 您在JSON中没有作为键或属性的相关数字,因此Firebase没有可匹配的内容
  • 您似乎认为
    startAt()
    可以与偏移一起使用,但实际情况并非如此。Firebase
    startAt()
    /
    endAt()
    查询是基于光标的,这意味着您需要指定一个从开始的值

    例如,您可以执行以下操作:

    mQuestionsDBReference.orderByKey().startAt("-M3qm...Q2Tz-")...
    
    或者从一个特定的问题开始:

    mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...
    
    要允许随机访问,请执行以下操作:

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

    • ,这适用于Firestore,但同样的原则适用于实时数据库
    • 还有更多

    如果有成千上万的问题怎么办。这会占用很多空间。即使这是一个Java问题,而不是JS,也会对我有所帮助。谢谢你,伙计!我很高兴我帮了点忙!非常感谢您不仅提供了答案,还提供了所有的文档和视频。您的团队为绝对初学者和小型初创企业创建了一个很棒的工具:D
    mQuestionsDBReference.orderByChild("Question").startAt("¿question?")...