如何将键和值从Firebase数据库放入哈希图?

时间:2018-06-27 12:23:35

标签: java android database firebase-realtime-database hashmap

我有数据库中的dataSnapshot列表

dataSnapshot:
"DataSnapshot { key = personTypes,
value = {RESIDENT_HOMEOWNER=Resident Homeowner, 
RESIDENT_RELATIVE=Resident Relative,
ADMIN=Admin, DRIVER_OUT=Driver Stay-out} }"

和来自数据:(数据库)

data:
"DataSnapshot { key = ADMIN,
value = Admin }"

我的代码是

private Map<String, String> personTypeToDisplayMap = new HashMap<>();
private Map<String, String> displayToPersonTypeMap = new HashMap<>();

public void fetchPersonTypes() {
    getDbRefKlearyan().child("personTypes").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.hasChildren()) {
                for(DataSnapshot data : dataSnapshot.getChildren()) {
                    personTypeToDisplayMap.put(data.getKey(), data.getValue(String.class));
                    displayToPersonTypeMap.put(data.getValue(String.class), data.getKey());
                }
            }
        }

        @Override public void onCancelled(DatabaseError databaseError) {}
    });
}

现在,我的问题是我无法在personTypetoDisplayMap和displayToPersonTypeMap中存储任何数据。每次调试应用程序时,其大小始终为size = 0。

我也尝试过做personTypeToDisplayMap.put("string", "sassy"); 进行测试,但结果相同

1 个答案:

答案 0 :(得分:0)

您现在不能使用尚未加载的内容。换句话说,您不能简单地在personTypeToDisplayMap方法之外使用displayToPersonTypeMaponDataChange()映射,因为由于该方法的异步行为,它将始终具有zero的大小。这意味着,当您尝试在该方法之外使用这些地图时,数据尚未从数据库中加载完毕,这就是为什么无法访问该数据的原因。

对此问题的快速解决方案是仅在onDataChange()方法内使用两个映射,否则我建议您从此 post 在其中,我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。