правильный способ удаления элементов из базы - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать removeValue () для удаления элементов из моей базы данных. когда я запускаю приложение, происходит сбой, потому что в методе onChange, очевидно, появляется нулевой указатель.

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

это значения, которые я удаляю

 DatabaseReference detailref = bookingref.child("Bookings").child(customerid);
    detailref.child("Housenumber").removeValue();
    detailref.child("Address").removeValue();
    detailref.child("Postcode").removeValue();
    detailref.child("Phone").removeValue();
    detailref.child("Date").removeValue();

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

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.getChildrenCount()!=0){
                house = dataSnapshot.child("Housenumber").getValue().toString();
                address = dataSnapshot.child("Address").getValue().toString();
                postcode = dataSnapshot.child("Postcode").getValue().toString();
                phone = dataSnapshot.child("Phone").getValue().toString();
                date = dataSnapshot.child("Date").getValue().toString();

здесь - ошибка нулевого указателя из моего Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at studios.p9p.h20.showroomfinish_adminapp.Booking_details$4.onDataChange

Ответы [ 2 ]

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

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

 DatabaseReference detailref = bookingref.child("Bookings").child(customerid);
 detailref.removeValue();

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

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  if(dataSnapshot.exists()
     {
        if (dataSnapshot.getChildrenCount()!=0){
            if(dataSnapshot.hasChild("Housenumber")
           {
            house = dataSnapshot.child("Housenumber").getValue().toString();
            }
            if(dataSnapshot.hasChild("Address")
            {
            address = dataSnapshot.child("Address").getValue().toString();
            }
            if(dataSnapshot.hasChild("Postcode")
            {
            postcode = dataSnapshot.child("Postcode").getValue().toString();
            }
            if(dataSnapshot.hasChild("Phone")
            {
            phone = dataSnapshot.child("Phone").getValue().toString();
            }
            if(dataSnapshot.hasChild("Date")
            {
            date = dataSnapshot.child("Date").getValue().toString();
            }
     } }

Надеюсь, это поможет:)

0 голосов
/ 30 января 2020

Я использовал ответ выше, но гораздо проще. я создал модель firebase со всеми моими строками в ней, названную bookingModel (), затем в стороне от моего ondataChange () я мог бы изменить весь громоздкий код ниже:)

house = dataSnapshot.child("Housenumber").getValue().toString();
address = dataSnapshot.child("Address").getValue().toString();
postcode = dataSnapshot.child("Postcode").getValue().toString();
phone = dataSnapshot.child("Phone").getValue().toString();
date = dataSnapshot.child("Date").getValue().toString();

id уже получил строку идентификатора пользователя для ссылки узел с именем customerId, поэтому я использовал это вместо этого в моем onDataChanged ()

if(dataSnapshot.hasChild(customerId))
bookingModel firebase_model = 
dataSnapshot.child(customerId).getValue(bookingModel.class)

, затем для удаления я звоню

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