Удаление строки из вида переработчика и базы огня

Ну, спецификация файла класса . говорит:

Дескриптор метода действителен только в том случае, если он представляет параметры метода с общей длиной 255 или менее, где эта длина включает в себя вклад для этого в случае вызова метода экземпляра или интерфейса. Суммарная длина рассчитывается путем суммирования вкладов отдельных параметров, где параметр типа long или double вносит два блока в длину, а параметр любого другого типа вносит один блок.

0
задан Frank van Puffelen 2 March 2019 в 14:52
поделиться

1 ответ

Чтобы удалить узел из базы данных Firebase Realtime, вам нужна ссылка на его точный, полный путь. У вас есть такие ссылки при загрузке данных. Например, в onDataChange вы можете удалить каждый узел с помощью:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
        //Booking b = dataSnapshot1.getValue(Booking.class);
        dataSnapshot1.getRef().removeValue();
    }
}

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

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

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

Итак, сначала вы добавляете List<String> для ключей к вашему адаптеру:

ArrayList<Booking> bookings;
ArrayList<String> keys;

И принимаете это в конструкторе адаптера:

public MyAdapterBookings(Context c , ArrayList<Booking> b, ArrayList<String> k)
{
    context = c;
    bookings = b;
    keys = k;
}

Затем вы добавляете каждый ключ в onDataChange:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    Log.d(TAG, "populating recyclerview");

    list = new ArrayList<Booking>();
    List<String> keys = new ArrayList<String>();
    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
        Booking b = dataSnapshot1.getValue(Booking.class);
        list.add(b);
        keys.add(dataSnapshot1.getKey());
    }
    adapter = new MyAdapterBookings(CustomerProfile.this, list, keys);
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

И, наконец, вы можете найти ключ для удаляемого элемента:

public void deleteItem(int position){
    String key = keys.get(position);
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Booking");
    ref.child(key).removeValue();
}
0
ответ дан Frank van Puffelen 2 March 2019 в 14:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: