Как поместить ключ и значение из базы данных firebase в hashmap? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть этот список 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 голосов
/ 27 июня 2018

Вы не можете использовать что-то, что еще не было загружено. Другими словами, вы не можете просто использовать карты personTypeToDisplayMap и displayToPersonTypeMap вне метода onDataChange(), потому что он всегда будет иметь размер zero из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать эти карты вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны.

Быстрое решение этой проблемы - использовать обе карты только внутри метода onDataChange(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого поста в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

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