これはFirebaseからデータを取得するための正しい方法は何ですか?

WhiteGlove:

前書き

私は学校のためのアプリをやっているし、私が原因あなたに多くを助けることができる彼らの豊富なビデオやオンライン材料にFirebaseを選びだしてきました。しかし、これらのような問題は、あなたがより多くの経験を積んだ人で、ここで解決できる何かに新しく追加されたとき。

私はこれまで理解しています

私はFirebaseからのリアルタイムのデータベースからランダムデータオブジェクトを取得します。私は、チュートリアルビデオに含まれて例を示唆する他の記事を見てきましたが、どれも私のために働くように見えるん:

私は次の構造を持つユーザーによってアップロードされた質問とDBを持っています:

(私は私の目標を達成しようとしているラインで自分のチュートリアル行を次してからではなく、質問のメッセージを言う理由は忘れて)

データを取得するためには、DBなどへの参照を作成する必要があります。

//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()

DB Iからランダムに質問を選択するために、この溶液を用いて行ってきました:

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) {

        }
    });
}

問題とゴール

私は正常にDBどちらも私が必要とするものからランダムに質問を取得することはできません。

目標は、ランダムな質問に、私はボタンを押すか、関数を呼び出すたびに取得することができることです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
フランクPuffelen:

あなたのmQuestionsDBReference.startAt(randomNumber())、ために動作しません。

  1. あなたは、順に何を指定していないので、startAt(randomNumber())どこから始めれば「知る」ことはありません。
  2. あなたはFirebaseが上一致するので、何もない、キーとして、またはJSONでプロパティとしてのいずれか該当する番号を持っていません。

あなたが考えているようだstartAt()ケースではありませんこれは、オフセットで使用することができます。Firebase startAt()/ endAt()クエリはあなたがで開始する値を指定する必要が意味し、カーソルベースとしています。

たとえば、あなたが行うことができます:

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

またはで特定の質問で起動します。

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

ランダムアクセスを許可するには:

  1. 各質問への値の予測可能な範囲を持つプロパティを追加します。
  2. その範囲内でランダムな値を計算します。
  3. そして、そのプロパティで注文し、その値から始まります。

参照してください:

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=401380&siteId=1