如何判断 Firebase 列表是否为空?

3
我使用ChildEventListener按照文档进行操作。在数据加载期间,我仅仅在ListView中显示一个进度动画。
  • If the list is not empty, then I hide/null the progress view.
  • If the list is void, I display "no item"

    // 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进行检查吗?


1
你正在寻找 DataSnapshot.hasChildren() 吗?文档表示 "指示此快照是否具有任何子项"。 - OneCricketeer
1个回答

3

您只能通过添加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()之后),并在那里打印消息。


我的使用情况并不是太多地删除项目,而更多的是在添加侦听器之前我不知道路径内是否有任何内容。如果列表为空,那么这没问题,但是对于一个包含1000个对象的列表,我将通过添加addEventValueListener下载一次对象池,然后通过addChildEventListener再下载一次。效率不高。 - Anthony
在同一查询或引用上使用ChildEventListenerValueEventListener将同时下载相同的数据。唯一的区别在于它们触发的事件/回调不同。如果您不想下载数据以查看是否存在任何内容,请考虑在JSON树中添加一个单独的dataExists节点,当您第一次添加节点时将其设置为true - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接