Обновление Firebase для нескольких дочерних значений из нескольких ключей для Specifi c дочерних значений - PullRequest
0 голосов
/ 12 января 2020

У меня ниже структура базы данных firebase. Я сохраняю номер мобильного телефона как дочернее имя. Что мне нужно сделать, это сначала получить значение tBid для каждого ключа, имеющего значение c mobile без значения, равного ok, затем добавить / вычесть число и затем обновить значение tBid для всех ключей в b_ookk_node

enter image description here

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

final String mobile_no = singleToneClass.getInstance().getData();

mDatabasebook = FirebaseDatabase.getInstance().getReference().child("b_ookk_node");
Query ref_book = mDatabase.child(mobile_no).equalTo("ok");

ref_book.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        if (dataSnapshot.hasChildren()) {

            for (DataSnapshot datas: dataSnapshot.getChildren()) {

                final int total_bid = Integer.parseInt(datas.child("tBid").getValue(String.class));
                String t_bid = Integer.toString(total_bid - 1);
                mDatabasebook.child("tBid").setValue(t_bid);

            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

1 Ответ

2 голосов
/ 12 января 2020

Предполагая, что b_ookk_node в вашем коде соответствует вычеркнутому узлу на вашем JSON снимке экрана, этот код выглядит нормально. Но для этого потребуется определить индекс для каждого номера мобильного телефона, поскольку индекс можно определить только для свойства, имя которого вы указали. Поскольку я предполагаю, что телефонные номера являются данными, введенными пользователем, определение индекса для каждого из них невозможно

Короче говоря: ваша текущая структура данных позволяет вам легко искать номер мобильного телефона пу sh ID, но не pu sh ID для номера мобильного телефона. Чтобы разрешить последнее, вам нужно настроить дополнительную структуру данных, которая выглядит следующим образом:

"number_to_pushid_map": {
  "096554885": {
    "-LyON1kEn...sWpW": true
    "-LyON1kEn...key2": true
  }
}

В этой структуре вы можете найти идентификатор pu sh для числа, которое пользователь Введено.

См. также:


Помимо этого :

  • if (dataSnapshot.hasChildren()) { в вашем коде не требуется. Если дочерних узлов нет, то dataSnapshot.getChildren() уже вернет пустой итератор, и l oop никогда не будет введено.
  • Рассмотрим , используя транзакцию для обновления bid, так как сейчас два пользователя, обновляющие ставку примерно в одно и то же время, могут перезаписать результаты друг друга.
  • Рассмотрите возможность сохранения значения tBid в виде числа, а не строки, так что вы не сможете нужно постоянно конвертировать его туда и обратно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...