DataSnapshot getValue () в Firebase возвращает ноль - PullRequest
0 голосов
/ 03 июля 2018

Одной из моих подпрограмм в методе onCreate () моей основной деятельности является взаимодействие с базой данных Firebase для выполнения одной из трех вещей: 1) Если пользователь является вернувшимся пользователем, обновите все свои настройки в Firebase, сохраненные с помощью SharedPreferences, локально. 2) Если пользователь новый и у него нет данных, хранящихся в облаке (они никогда не загружали приложение), ничего не делайте. 3) Если пользователь новый, но настройки хранятся под его уникальным идентификатором профиля Facebook, загрузите их и примените их к экземпляру SharedPreferences.

Мне, должно быть, не хватает некоторого ключевого, возможно, базового, понимания того, как работает DataSnapshot, потому что я не могу заставить работать мой следующий код:

    private void initializeFirebase(){
    my_db = FirebaseDatabase.getInstance();
    DatabaseReference my_ref = my_db.getReference();

    Map<String, ?> values = sharedPreferences.getAll();

    if (values.isEmpty()){
        final String id = Profile.getCurrentProfile().getId();
        my_ref = my_ref.child("userid");
        my_ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.getKey().equals(id)){
                    data = (Map<String, Object>)dataSnapshot.getValue();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
    else {
        for (Map.Entry<String, ?> entry : values.entrySet()) {
            my_ref.child("userid").child(Profile.getCurrentProfile().
                    getId()).child(entry.getKey()).setValue(entry);
        }
    }
}

data - это глобальная переменная Map, которая всегда равна нулю после выполнения getValue ().

Мое дерево JSON организовано следующим образом: root -> users -> userid -> каждое предпочтение является дочерним узлом для узла userid. Любая помощь будет оценена !!

1 Ответ

0 голосов
/ 03 июля 2018

Согласно документации API для getValue () , он может возвращать ноль:

Данные, содержащиеся в этом снимке, как собственные типы или ноль, если в этом месте нет данных.

Итак, у запрашиваемого местоположения нет данных.

Я собираюсь догадаться, что вы не хотели жестко кодировать значение "userid" в вашей ссылке. Могу поспорить, что вы хотите использовать идентификатор пользователя из предыдущей строки:

final String id = Profile.getCurrentProfile().getId();
my_ref = my_ref.child(id);  // id instead of "userid"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...