Это правильный способ получения данных из Firebase? - PullRequest
1 голос
/ 02 апреля 2020

Введение

Я делаю приложение для школы, и я выбрал Firebase из-за их обширных видео и онлайн-материалов, которые могут вам помочь. Но подобные проблемы, когда вы новичок в чем-то, могут быть решены здесь более опытными людьми.

Что я понял до сих пор

Я хочу получить случайные данные объект из базы данных в реальном времени от Firebase. Я видел другие посты, предлагающие примеры, включенные в обучающие видео, но ни одна из них не работает для меня:

У меня есть БД с вопросами, загруженными пользователями со следующей структурой:

(Забудьте, почему он говорит сообщения вместо вопросов, так как я построчно следил за их учебниками, пытаясь достичь sh моей цели)

Чтобы получить данные, вы должны создать ссылка на БД как:

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ваш mQuestionsDBReference.startAt(randomNumber()) не будет работать, потому что:

  1. Вы не указываете, что заказывать, поэтому startAt(randomNumber()) не будет "знать", с чего начать.
  2. У вас нет соответствующего числа в качестве ключа или свойства в JSON, поэтому Firebase не с чем совпадать.

Похоже, вы можете использовать startAt() со смещением, что не так. Firebase startAt() / endAt() запросы основаны на курсоре, то есть вам нужно указать значение, с которого нужно начинать.

Например, вы можете сделать:

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

или начать с Speci c вопрос с:

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

Чтобы разрешить произвольный доступ:

  1. Добавить свойство с предсказуемым диапазоном значений для каждого вопроса.
  2. Рассчитать случайное значение в этом диапазоне.
  3. Затем упорядочите по этому свойству и начните с этого значения.

См. также:

1 голос
/ 02 апреля 2020

Я бы предложил загрузить все вопросы в ArrayList, что значительно упростит задачу. https://firebase.google.com/docs/database/web/read-and-write

Надеюсь, это может вам чем-то помочь, или дать вам представление о том, как улучшить ваш код, если нет, то извините, я не смог бы вам чем-то помочь !

Это аналогичный вопрос (ответ)

Получить случайный предмет из Firebase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...