Можно ли вызвать два разных дерева из базы данных Firebase реального времени в одном файле Java? - PullRequest
0 голосов
/ 25 апреля 2019

database looked like this

В настоящее время я называю ссылку "Свойство", но в то же время я хочу также назвать ссылку "Геозона".Возможно ли сделать это в том же файле Java?Я хочу, чтобы данные из свойства и "Geo-fence" использовались в одном фрагменте.Другие решения будут оценены.

reference = FirebaseDatabase.getInstance().getReference("Property");
refGeo = FirebaseDatabase.getInstance().getReference("Geo-fence");

1 Ответ

1 голос
/ 25 апреля 2019

Согласно вашему комментарию, если вам нужно получить latitude и longitude из обоих узлов и сравнить расстояние, предполагая, что оба свойства в обоих местах имеют тип double и , а не строка, пожалуйста, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference geoFenceUidRef = rootRef.child("Geo-fence").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        double geoFenceLat = dataSnapshot.child("Latitude").getValue(Double.class);
        double geoFenceLng = dataSnapshot.child("Longitude").getValue(Double.class);
        Location geoFenceLocation = new Location("");
        geoFenceLocation.setLatitude(geoFenceLat);
        geoFenceLocation.setLongitude(geoFenceLng);
        Log.d(TAG, geoFenceLat + ", " + geoFenceLng);

        DatabaseReference propertyUidRef = rootRef.child("Property").child(uid);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    double propertyLat = ds.child("latitude").getValue(Double.class);
                    double propertyLng = ds.child("longitude").getValue(Double.class);
                    Log.d(TAG, propertyLat + ", " + propertyLng);

                    //Compare
                    Location propertyLocation = new Location("");
                    propertyLocation.setLatitude(propertyLat);
                    propertyLocation.setLongitude(propertyLng);
                    float distance = geoFenceLocation.distanceTo(propertyLocation);
                    Log.d(TAG, String.valueOf(distance));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        propertyUidRef.addListenerForSingleValueEvent(eventListener);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
geoFenceUidRef.addListenerForSingleValueEvent(valueEventListener);

Если вы сохранили их в виде строк, измените приведенные выше строки кода на:

double geoFenceLat = Double.parseDouble(dataSnapshot.child("Latitude").getValue(String.class));
double propertyLng = Double.parseDouble(dataSnapshot.child("Longitude").getValue(String.class));

и

double propertyLat = Double.parseDouble(ds.child("latitude").getValue(String.class));
double propertyLng = Double.parseDouble(ds.child("longitude").getValue(String.class));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...