несколько (вложенных) ValueEventListeners не работают в базе данных реального времени Firebase для Android - PullRequest
0 голосов
/ 21 мая 2018

Проект, над которым я работаю, имеет 3 «таблицы» в базе данных реального времени firebase, а именно:

Users (содержит регистрационную информацию пользователей, например, электронную почту, пароли, номера мобильных телефонов и т. Д.)

VictimProfiles(Содержит базовую информацию о профиле, такую ​​как строка профиля профиля, имя, должность и соответствующий идентификатор пользователя из таблицы «Пользователи»)

VolunteerProfiles (содержит адрес, широту, долготу, время доступности и соответствующие идентификаторы UserID и VictimProfileID (сгенерированные).от Firebase))

в своей деятельности на Google Картах я должен добавить маркеры на местоположение каждого добровольца, а также пользователя, который в данный момент использует приложение, с настраиваемым информационным окном, отображающим необходимую информацию оДобровольцы, однако, как показано в коде ниже, когда я пытаюсь получить доступ к таблице VictimProfile и Users из ValueEventListener таблицы добровольцев, их данные не записываются в общедоступные строки, в которые я их пишу.Я знаю, это звучит запутанно, но взгляните на код, и вы поймете, что я имею в виду

    public void DropVolunteerMarkers()
    {
        //DROP ALL MARKERS FUNCTION
        volunteerDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot volunteerprofile:dataSnapshot.getChildren())
                {

                    key=(String) volunteerprofile.child("UserID").getValue();
                    victimID=(String) volunteerprofile.child("VictimProfileID").getValue();
                    getVictimInfo();//GET NAME,PIC,JOB TITLE FROM THE VICTIM TABLE FOR THIS SPECIFIC VOLUNTEER
                    getUserInfo();//GET EMAIL AND PHONE NUMBER FROM USERS TABLE FOR THIS SPECIFIC VOLUNTEER
                    String currentuserid=SaveSharedPreference.getUserName(FindNearbyVolunteers.this);
                    if(!key.equals(currentuserid))//TO AVOID CURRENT USER BEING SHOWN AS A VOLUNTEER
                    {
                        address= (String)volunteerprofile.child("Address").getValue();
                        availabiliity=(String)volunteerprofile.child("Availability").getValue();
                        String LAT= (String) volunteerprofile.child("Latitude").getValue();
                        String LNG= (String) volunteerprofile.child("Longitude").getValue();
                        Toast.makeText(FindNearbyVolunteers.this,LAT+", "+LNG,Toast.LENGTH_SHORT).show();
                        Double Lat= Double.parseDouble(LAT);
                        Double Long= Double.parseDouble(LNG);
                        LatLng latLng = new LatLng(Lat,Long);
                        MarkerOptions markerOptions = new MarkerOptions();
                        markerOptions.position(latLng);
                        Toast.makeText(FindNearbyVolunteers.this,key+", "+victimID+", "+name+", "+jobtitle+", "+availabiliity+", "+email+", "+address,Toast.LENGTH_LONG).show();
                        //mMap.setInfoWindowAdapter(new VolunteerPopupAdapter(FindNearbyVolunteers.this,name,jobtitle,availabiliity,email,address,dp,number));
                        markerOptions.title(volunteerprofile.getKey().toString());
                        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
                        mCurrLocationMarker = mMap.addMarker(markerOptions);
                    }
                    else{
                        //IN CASE OF CURRENT USER
                            //Place current location marker
                            LatLng latLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
                            MarkerOptions markerOptions = new MarkerOptions();
                            markerOptions.position(latLng);
                            markerOptions.title("YOU");
                            markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                            mCurrLocationMarker = mMap.addMarker(markerOptions);
                }}

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

метод getVictimInfo ():

 private void getVictimInfo()
    {
        victimDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot victimProfile:dataSnapshot.getChildren())
                {
                    if(victimProfile.getKey().equals(victimID))
                    {
                        dp=(String)victimProfile.child("DP").getValue();
                        jobtitle=(String)victimProfile.child("JobTitle").getValue();
                        name=(String)victimProfile.child("Name").getValue();

                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

метод getUserInfo ()

        private void getUserInfo(){
        userDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot userProfile:dataSnapshot.getChildren())
                {
                    if(userProfile.getKey().equals(key))
                    {
                        email=(String)userProfile.child("Email").getValue();
                        number=(String)userProfile.child("Mobile").getValue();;

                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

строка, в которой я должен сохранить значения

 DatabaseReference volunteerDatabaseReference,userDatabaseReference,victimDatabaseReference;
String dp,jobtitle="no value",name="no value";
String email="no value",number="no value",address="no value",availabiliity="no value",victimID,key;

мой снимок экрана базы данных введите описание изображения здесь

1 Ответ

0 голосов
/ 21 мая 2018

Вы не можете использовать что-то, что еще не было загружено.Другими словами, вы не можете просто объявить dp, jobtitle и email как глобальную переменную и использовать их вне метода onDataChange(), потому что это всегда будет null из-за асинхронного поведения этого метода.Это означает, что к тому времени, когда вы пытаетесь использовать эти значения вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны, и вы всегда получаете null, и поэтому ничего не написано в вашембаза данных.

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

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