Как использовать onChildRemoved в базе данных Firebase Realtime? - PullRequest
0 голосов
/ 25 августа 2018

Хорошо, поэтому я хотел знать, как onChildRemoved работает в Firebase Realtime Databse.Я могу добавлять данные, как только пользователь добавляет данные, т. Е. В режиме реального времени.Но я хочу сделать то же самое, когда пользователь удаляет данные.Как поступить с этим?Я прочитал документацию, но не смог ее получить.

Любая помощь будет оценена.

PS: я могу удалить данные на mRootRef.child("message").removeValue(); , но мне нужно вернуться и снова вернуться к этому действию, чтобы увидеть изменения.

private void loadmessage(String class_id, String email_red) {
            messageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                    Message message = dataSnapshot.getValue(Message.class);
                    messageList.add(message);
                    mAdapter.notifyDataSetChanged();
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                   //what to add here??
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Ответ от @ mark922 имеет суть, но вам понадобится еще несколько шагов.

При удалении сообщения из базы данных вы получите DataSnapshot этого удаленного сообщения в onChildRemoved.Вам необходимо:

  1. Найти соответствующее сообщение в вашем messageList.
  2. Удалить сообщение из списка.
  3. Позвонить mAdapter.notifyDataSetChanged(), чтобы сделатьАдаптер перерисовывает представление списка / переработчика.

Хитрый бит - это шаг 1, потому что это означает, что вам нужно найти сообщение.Самый простой способ сделать это - сохранить DataSnapshot.getKey() для каждого сообщения.Поскольку ключ каждого дочернего узла должен быть уникальным, гарантированно будет только одно сообщение для каждого ключа.

Простой способ добавить это в текущий код - добавить keyList:

List<String> keyList = new ArrayList<String>();

А затем добавьте ключ каждого DataSnapshot в этот список, когда вы добавляете значение t messageList:

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    Message message = dataSnapshot.getValue(Message.class);
    messageList.add(message);
    keyList.add(dataSnapshot.getKey());
    mAdapter.notifyDataSetChanged();
}

Теперь у вас есть keyList и messageList и элементы в каждом индексе соответствуют друг другу.Таким образом, ключ в keyList[0] соответствует значению в messageList[0] и т. Д.

Это означает, что в onChildRemoved вы можете найти индекс для сообщения, которое было удалено в keyList, а затем удалитьэто сообщение от messageList и keyList на основе индекса:

public void onChildRemoved(DataSnapshot dataSnapshot) {
    int index = keyList.indexOf(dataSnapshot.getKey());
    messageList.remove(index);
    keyList.remove(index);
    mAdapter.notifyDataSetChanged();
}

Примечание о вставке сообщений

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

В этом случае значение String s, которое передается в onChildAdded, становится важным, поскольку на самом деле это String previousChildKey: ключ дочернего элемента до , в который был вставлен новый дочерний элемент.Чтобы правильно обрабатывать этот сценарий, вы должны отслеживать порядок элементов, например, вставляя ключ и значение в правильный индекс в их соответствующие списки.В этот момент вы также захотите обработать onChildChanged и (что более важно для этого сценария) onChildMoved.

Все это не невероятно сложно, но довольно легко ошибиться.Я бы рекомендовал взглянуть на класс FirebaseArray от FirebaseUI в качестве примера / источника вдохновения.

0 голосов
/ 15 мая 2019

Простой способ добавить это к текущему коду - добавить список ключей:

List<String> keyList = new ArrayList<String>();

А затем добавьте ключ каждого DataSnapshot в список ключей при добавлении значения в messageList:

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
    String key = dataSnapshot.getKey();
    int index = keyList.indexOf(key);

    if (index != -1) {
        messageList.remove(index);
        keyList.remove(index);
    }
    mAdapter.notifyDataSetChanged();
}
0 голосов
/ 25 августа 2018

Добавьте следующий код вместо //what to add here??

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
    //what to add here??
    Message message = dataSnapshot.getValue(Message.class);
    messageList.remove(message);
    mAdapter.notifyDataSetChanged();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...