GeoFire Firebase Query не может сохранить userID в ArrayList - PullRequest
0 голосов
/ 03 апреля 2019

Я использую GeoFire, чтобы получить всех пользователей с определенным радиусом.Когда я добавляю addGeoQueryEventListener и затем использую цикл for, чтобы получить весь идентификатор пользователя, вместо того, чтобы возвращать UserID, он уходит в другое гнездо глубже, возвращая g и 1.

private int radius = 40;
private Boolean userFound = false;
private String userLocationID;
private ArrayList<String> mUserIDLocation;
final UserLocation userLocation = new UserLocation();
public void getUserLocation() {

    mUserIDLocation = new ArrayList<String>();

    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling

        return;
    }
    fusedLocationClient.getLastLocation().addOnSuccessListener((Activity) MainActivity.this, new OnSuccessListener<Location>() {

        @Override
        public void onSuccess(Location location) {

            if (location != null) {
                //Toast.makeText(this, "UserLocation " + location.toString(), Toast.LENGTH_SHORT ).show();
                //final Location userLocation = location;
                Log.d(TAG, "onSuccess: UserLocation" + location);
                Log.d(TAG, "onSuccess: UserLocation Latitude " + location.getLatitude());

                String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
                final DatabaseReference mRef = FirebaseDatabase.getInstance().getReference();

                final GeoFire geoFire = new GeoFire(mRef.child("user_location"));
                geoFire.setLocation(user_id, new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
                    @Override
                    public void onComplete(String key, DatabaseError error) {

                    }
                });

                GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(location.getLatitude(), location.getLongitude()), radius);


                geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
                    @Override
                    public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
                        Log.d(TAG, "onDataEntered: DataSnapshot Key " + dataSnapshot);

                        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                            mFollowing.add(snapshot.getKey());
                        }

                        getPost();
                        Log.d(TAG, "onDataEntered: mFollowing " + mFollowing);
                        Log.d(TAG, "onDataEntered: mFollowing size " + mFollowing.size());

                    }

                    @Override
                    public void onDataExited(DataSnapshot dataSnapshot) {

                    }

                    @Override
                    public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {

                    }

                    @Override
                    public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {

                    }

                    @Override
                    public void onGeoQueryReady() {

                    }

                    @Override
                    public void onGeoQueryError(DatabaseError error) {

                    }
                });
            }
        }
    });

}

Журнал для снимка базы данных:

onDataEntered: DataSnapshot ключ DataSnapshot {ключ = xjfXxJ3spuPNywtHyqg5rNnlIMD3, значение = {.priority = c295tcm4kd, L = {0 = 48,435, 1 = -122,084}, г = c295tcm4kd}}

onDataEntered: DataSnapshot Key DataSnapshot {ключ = TMOb5NL8igZovGkiZdVcl3UQmxV2, значение = {.priority = c295myvnsd, l = {0 = 48.4319983, 1 = -122.084}, g = c295myvnsd}} 1012 * * *2 * * 0в mFollowing ArrayList: onDataEntered: mFollowing [g, l] onDataEntered: mFollowing [g, l, g, l]

Журнал для размера mFollowing ArrayList: onDataEntered: mFollowing size2 onDataEntered: размер mFollowing 4

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

То, что я ожидаю, произойдет при добавлении идентификатора пользователяк mFollowing икогда я запускаю журнал для mFollowing, я вижу только 2 идентификатора пользователя в массиве и число равно 2.

1 Ответ

0 голосов
/ 06 апреля 2019

Я выясняю проблему.OnDataEntered() - это цикл, который проверяет всех пользователей в этой области.Таким образом, вы сохраняете всех пользователей в одном Arraylist, а затем передаете их в другой список массивов в OnGeoQueryReady()

Ниже приведен правильный код.

    private int radius = 40;
    private Boolean userFound = false;
    private String userLocationID;
    private ArrayList<String> mUserIDLocation;
    final UserLocation userLocation = new UserLocation();
    public void getUserLocation() {
        final DatabaseReference mRef = FirebaseDatabase.getInstance().getReference();
        final GeoFire geoFire = new GeoFire(mRef.child("user_location"));
        mUserIDLocation = new ArrayList<String>();

        swipe.setRefreshing(false);

        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling

            return;
        }
        fusedLocationClient.getLastLocation().addOnSuccessListener((Activity) MainActivity.this, new OnSuccessListener<Location>() {

            @Override
            public void onSuccess(Location location) {

                if (location != null) {
                    //Toast.makeText(this, "UserLocation " + location.toString(), Toast.LENGTH_SHORT ).show();
                    //final Location userLocation = location;
                    Log.d(TAG, "onSuccess: UserLocation" + location);
                    Log.d(TAG, "onSuccess: UserLocation Latitude " + location.getLatitude());

                    String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();




                    geoFire.setLocation(user_id, new GeoLocation(location.getLatitude(), location.getLongitude()), new GeoFire.CompletionListener() {
                        @Override
                        public void onComplete(String key, DatabaseError error) {

                        }
                    });

                    GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(location.getLatitude(), location.getLongitude()), radius);


                    geoQuery.addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
                        @Override
                        public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {

                            Log.d(TAG, "onDataEntered: datasnapshot " + dataSnapshot);

                            mUserIDLocation.add(dataSnapshot.getKey());


                        }

                        @Override
                        public void onDataExited(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {

                        }

                        @Override
                        public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {

                        }

                        @Override
                        public void onGeoQueryReady() {

                            mFollowing = mUserIDLocation;

                            Log.d(TAG, "onGeoQueryReady: mFollowing users " + mFollowing);

                            getPost();
                        }

                        @Override
                        public void onGeoQueryError(DatabaseError error) {

                        }
                    });
                }
            }
        });

    }

Теперь размер массива будет правильным, когдаmFollowing передается getPost()

...