Firebase如何返回数据?

时间:2017-04-24 17:59:04

标签: android firebase firebase-realtime-database

我想从Firebase获取数据,然后返回ArrayList。我不想经常听取数据库的变化。我只想立即查询数据库一次,所以我使用 addListenerForSingleValueEvent ,我认为这将允许我从数据库中获取数据并简单地返回它,但遗憾的是列表是空的。 我尝试在 onDataChange 方法结束时更新列表,但由于列表为空,它仍然无效。

private List<ContactsDTO> contacts = new ArrayList<>();

public void updateContacts(List<ContactsDTO> contacts) {
    this.contacts = contacts;
}

public void getContactsDB() {

    refContacts.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<ContactsDTO> temp = new ArrayList<>();
            for(DataSnapshot child : dataSnapshot.getChildren()) {
                ContactsDTO contactDTO = child.getValue(ContactsDTO.class);
                temp.add(contactDTO);
            }

            updateContacts(temp);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("error");
        }
    });
}

public List<ContactsDTO> getContacts() {
    getContactsDB();
    System.out.println("contacts size: " + contacts.size()) // list will be empty
    return contacts;
}

//编辑:

我在 onDataChange 方法中正确获取数据,因此db结构不是问题所在,但是如您所愿:

enter image description here

你知道如何实现它吗?

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为onDataChange是异步调用的,并且在调用onDataChange之前执行语句return contacts。因此,为了使用temp List<ContactsDTO>,您需要在onDataChange()方法中使用它。

要解决此问题,请访问此post和此post

希望它有所帮助。