Как узнать, недействителен ли список Firebase?

Я использую ChildEventListener в соответствии с документом. Во время загрузки данных я просто делаю видимым прогресс, отображаемый в списке.

  • Если список не пуст, я скрываю/обнуляю представление прогресса.
  • Если список пуст, я показываю «нет элемента»

    // Get a reference to our posts
    Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");
    
    ref.addChildEventListener(new ChildEventListener() {
        // Retrieve new posts as they are added to the database
        @Override
        public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
            BlogPost newPost = snapshot.getValue(BlogPost.class);
            System.out.println("Author: " + newPost.getAuthor());
            System.out.println("Title: " + newPost.getTitle());
        }
    
        //... ChildEventListener also defines onChildChanged, onChildRemoved,
        //    onChildMoved and onCanceled, covered in later sections.
    });
    

С ref.addValueEventListenerмы можем просто проверить, что datasnapshot равно нулю, чтобы узнать это.

Как узнать, что список недействителен? Является ли это возможным ? Без предварительной проверки с addValueEventListener ?


person Anthony    schedule 14.12.2015    source источник
comment
Вы ищете DataSnapshot.hasChildren()? Документы говорят Указывает, есть ли у этого моментального снимка дочерние элементы.   -  person OneCricketeer    schedule 14.12.2015


Ответы (1)


Вы можете узнать, что в списке нет элементов, только прикрепив ValueEventListener.

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        if (!snapshot.hasChildren()) {
            System.out.println("List is empty");
        }
    }
    @Override
    public void onCancelled(FirebaseError error) {
    }
}

Но имейте в виду, что обычно, если вы вызываете addChildEventListener(), вы в конечном итоге сохраняете элементы во внутреннем хранилище, таком как List. Вы также можете просто проверить, не пусто ли это внутреннее хранилище (после onChildRemoved()), и напечатать там сообщение.

person Frank van Puffelen    schedule 14.12.2015
comment
Мое использование связано не столько с удалением элементов, сколько с тем, чего я не знаю, перед добавлением слушателя, есть ли что-то внутри пути или нет. В случае пустого списка это нормально, но со списком из 1000 объектов я загружу один раз извлечение объекта, добавив addEventValueListener, а затем второй раз, addChildEventListener. Не так эффективно. - person Anthony; 14.12.2015
comment
ChildEventListener и ValueEventListener в одном и том же запросе или ссылке будут загружать одни и те же данные одновременно. Единственная разница заключается в событиях/обратных вызовах, которые они запускают. Если вы не хотите загружать данные, чтобы узнать, существует ли что-либо, рассмотрите возможность добавления отдельного узла dataExists в дерево JSON, которому вы присвоили значение true при первом добавлении узла. - person Frank van Puffelen; 15.12.2015