Извлечение переменной из динамической базы данных Firebase - PullRequest
0 голосов
/ 06 ноября 2018

Итак, у меня есть игровое лобби, в котором, когда пользователь создает игру, его имя пользователя и количество игровой валюты, на которое он делает ставку в игре, отображается на экране, чтобы все игроки могли видеть его в RecyclerView.

Таким образом, в этом случае пользователь с именем 'Brent_MB' создал игру

enter image description here

Но проблема в том, что игрок поставил ставку в 2,00 на игру, и она не появится. (2.50 - это номер по умолчанию, который появляется)

Вот так выглядит моя структура базы данных

enter image description here

Итак, поскольку эта база данных настолько динамична, она буквально меняется каждый раз, когда кто-то хочет играть в игру, и она удаляется при запуске игры, как я могу назначить значение ставки в слоте, который в настоящее время говорит «2,50»?

Вот что я пытался сделать:

Я создал обратный вызов для переменной пари, как это,

public void getWager(final WagerCallback wagerCallback) {
    FCGames.child("What do I put here to check each node every time a node is added")
            .child("wager").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                wagerr = (long) dataSnapshot.getValue();
                String wagerD = Double.toString(wagerr);
                wage = wagerD.endsWith("0");

                wagerCallback.onCallback(wagerD);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });
}

У меня также есть интерфейс Callback с этим, но он не выглядит актуальным.

и затем я вызываю этот метод в своем классе RecyclerView следующим образом:

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    String userName = mData.get(position);
    holder.userName.setText(userName);
    holder.bind(mData.get(position), position, listener);

        fcl.getWager(new FlipCoinLobby.WagerCallback() {
            @Override
            public void onCallback(String wager) {
                holder.wager.setText(wager);
            }
        });

}

Как вы можете видеть, в этой строке я застрял на том, что нужно указать в качестве первого дочернего элемента, чтобы он мог проверять каждого дочернего элемента при добавлении и получать это значение ставки. \

FCGames.child("What do I put here to check each node every time a node is added").child("wager")

Что я должен поместить туда, чтобы он мог получить значение ставки от каждого узла и соответствующим образом назначить его области просмотра текста?

Каждый начальный узел в базе данных FCGames хранится в ArrayList с именем openGames. Я могу показать, как узлы добавляются в этот список при необходимости

wages.add(wagerD);

for(int i=0; i <= openGames.size(); i++) {
   wagerCallback.onCallback(wages.get(i));
}

1 Ответ

0 голосов
/ 06 ноября 2018

Поскольку вы не знаете ключ дочернего узла, который пытаетесь загрузить, у вас есть два варианта:

  1. Загрузить все дочерние узлы FCGames.
  2. Загрузить первый / последний дочерний узел FCGames.

Я покажу второй вариант, поскольку первый легко выводится из этого:

FCGames.orderByKey()
       .limitToFirst(1)
       .addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            wagerr = snapshot.child("wager").getValue(Long.class);
            String wagerD = Double.toString(wagerr);
            wage = wagerD.endsWith("0");

            wagerCallback.onCallback(wagerD);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});

Самые большие различия:

  • Я использую запрос, чтобы получить только первый ключ.
  • Затем мне нужно использовать цикл в onDataChange, поскольку запросы могут иметь несколько результатов (хотя это и не так).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...