Пропуск прослушивателя Firebase

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-база данных в реальном времени

Вопрос:

Я перешел на Firebase для своей разработки на Android, поскольку хочу использовать многие функции Firebase (уведомления, обмен сообщениями, хранилище и т.д.), Однако у меня возникают трудности с получением данных из Firebase и я не могу найти подробную информацию в Интернете. Да, я пробовал документацию, но она не объясняет события, с которыми я сталкиваюсь.

Я хочу извлечь все данные, которые у меня есть, и вставить их в arraylist объектов. Вот статический пример:

 users[i] = new User("James"   (i*2.5), "Hmack00"   (i*2), "https://firebasPic_2019.03.03.05.26.35.jpg.jpg?alt=mediaamp;token=cf", "United Kingdom"); 
  

База данных:

    {
      "Users" : {
        "4PdlTlv3qjZ3BmDvrJyUut9Fnq43" : {
          "Country" : "xx",
          "Fullname" : "hh",
          "ProfilePicture" : "htm/o/Images/SearchAdapter/4PdlTlv3qjZ3BmDvrJyUut9Fnq43/ProfilePicture/ProfilePic_2019.03.06.10.47.54.jpg.jpg?alt=mediaamp;token=b647708e-c6d5-4b45-bef0-3dc40301b73a",
          "Username" : "hmack001"
        },
        "COg4r4io9hezhFpmK3adPucUXA93" : {
          "Country" : "spain",
          "Fullname" : "nat",
          "ProfilePicture" : "hcom/o/Images/SearchAdapter/COg4r4io9hezhFpmK3adPucUXA93/ProfilePicture/ProfilePic_2019.03.06.19.14.17.jpg.jpg?alt=mediaamp;token=8620b321-5cef-42f0-a828-dbb7c37c8e7d",
          "Username" : "nat"
        },
        "Tw1xRxViygNsLqrQiaaMAvAduIu1" : {
          "Country" : "uk",
          "Fullname" : "harveyn",
          "ProfilePicture" : "t.com/o/Images/Users/Tw1xRxViygNsLqrQiaaMAvAduIu1/ProfilePicture/ProfilePic_2019.03.03.05.26.35.jpg.jpg?alt=mediaamp;token=c290e75a-5f92-4271-bcb5-c644fe1b14ef",
          "Username" : "RGB"
        },
        "vOxr1RoDqgWogKK1lp9pfpTHc6w2" : {
          "Country" : "scotland ",
          "Fullname" : "greg greg",
          "ProfilePicture" : "ot.com/o/Images/SearchAdapter/vOxr1RoDqgWogKK1lp9pfpTHc6w2/ProfilePicture/ProfilePic_2019.03.04.12.30.22.jpg.jpg?alt=mediaamp;token=27b024cf-0691-4121-8a27-26acf101ebc2",
          "Username" : "greg"
        },
        "xecUOPeyMcQaQrgkU9ouDgK90Ai1" : {
          "Country" : "ggh",
          "Fullname" : "Da apply ",
          "ProfilePicture" : "2FProfilePic_2019.03.03.04.58.50.jpg.jpg?alt=mediaamp;token=f35854c2-3ff9-4d18-9f7a-10c13f066c68",
          "Username" : "gg"
        }
      }
    }
  

Вот мой код, и я объясню свои ошибки после (я оставил в коде ‘zombie’, чтобы показать попытки, которые я предпринял)

 //Firebase Variables
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;

//Firebase Data
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    userId = mAuth.getCurrentUser().getUid();
    myRef = mFirebaseDatabase.getReference().child("Users").child(userId);

        //Firebase Data
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) { //Function called every time a change is made to the database
            showData(dataSnapshot);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) { //Function called when there is an error in the database/ with the call
            Log.d("Print","Cancelled Firebase: "   databaseError.toString());
        }
    });
}

private void showData(DataSnapshot dataSnapshot) {
    int userCount = 5;
    int i = 0;
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        //User user = new User();
        //User user = new User(); //Get Count of Firebase Users
        //user = new User();
        if (ds.child(userId).exists()) {
            /*user.setFullname(ds.child(userId).getValue(User.class).getFullname()); //set the full name
            user.setUsername(ds.child(userId).getValue(User.class).getUsername()); //set the username
            user.setProfilePicture(ds.child(userId).getValue(User.class).getProfilePicture()); //set the profile picture

            //Display Information
            Log.d("DataSnapchat Test", "ShowData Name: "   user.getFullname());
            Log.d("DataSnapchat Test", "ShowData Username: "   user.getUsername());
            Log.d("DataSnapchat Test", "ShowData Picture: "   user.getProfilePicture());

            ArrayList<String> userArrayList = new ArrayList<>();
            userArrayList.add(user.getFullname());
            userArrayList.add(user.getUsername());
            userArrayList.add(user.getProfilePicture());
            */

            String fullname = (String) ds.child(userId).child("Fullname").getValue();

            Toast.makeText(this, "Fullname: "   fullname, Toast.LENGTH_SHORT).show();

            //UserListAdapter adapter = new UserListAdapter(this, R.layout.find_profiles_search, userArrayList, mProfileSearch);
            //mListView.setAdapter(adapter);

            i  ;
        }
    }
}
  

Когда я отлаживаю код, функция showData никогда не вызывается, и ни одна из функций в прослушивателе событий значений не вызывается, это проблема асинхронности?

В настоящее время я пытаюсь извлечь данные и вставить их в переменную (буквально любые данные, как только у меня будет рабочий запрос, я могу преобразовать его в соответствие, манипулируя дочерними полями и т.д.).

Вопрос: Работает ли addValueListener только при изменении данных в базе данных? Если да, то какова альтернатива, если нет, то почему функции не работают.

Я не получаю никаких ошибок, и в консоль ничего не записывается.

Я хочу поместить свою базу данных в список массивов, я знаю, что мне не следует использовать getChildren для этого, поэтому я пытаюсь проверить, смогу ли я получить какие-либо данные, прежде чем пытаться получить все данные.

Комментарии:

1. Вы хотите сказать, что ни ваш onDataChange , ни ваш onCancelled не вызывается? Как в: если вы просто поместите Log.d инструкцию в `onDataChange , то ни одна из ваших инструкций ведения журнала не будет записана? Обычно это происходит только в том случае, если устройство не подключено к серверам Firebase.

2. Да, это то, что происходит. Однако я получаю правильный идентификатор пользователя из ‘getCurrentUser()’, и когда я отлаживаю код, переменная MAuth содержит правильное значение базы данных реального времени. Я не уверен, что это Aysnc probelm, и если это так, я не знаю, как этому противостоять.

3. Переменная myRef содержит — https://{название проекта}.firebaseio.com/Users /{Идентификатор пользователя}. Однако прослушиватель событий никогда не вызывается.

4. Извините, у меня все еще возникают трудности с разбором вашего кода, поэтому я пытаюсь упростить его. Идея в том, что вы запускаете упрощенный код и сообщаете нам результат. Если вы замените вызов на showData простым оператором log, отображается ли оператор log в выходных данных вашего журнала?

Ответ №1:

У вас есть несколько действительно странных циклов в showData() . Поскольку вы подключаете ValueEventListener к узлу конкретного пользователя, вы можете просто посмотреть значения свойств для этого конкретного пользователя:

 myRef = mFirebaseDatabase.getReference().child("Users").child(userId);

myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.d("OnDataChange", dataSnapshot.getKey());
        Log.d("OnDataChange", dataSnapshot.child("Fullname").getValue(String.class));
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("Print","Cancelled Firebase: "   databaseError.toString());
    }
});