Слушатель на динамический узел Firebase

238
21 октября 2017, 16:00

Идея в следующем: есть узел locations/ns/we и есть узел users/location/ который содержит ключи ns и we. При нажатии на кнопку, координаты и на 1 и на 2 узле изменяются, то есть было:

  • users/uid/location/ns:10
  • users/uid/location/we:1
  • locations/10/1

стало:

  • users/uid/location/ns:11
  • users/uid/location/we:1
  • locations/11/1

Мне нужно получить все узлы которые хранится на текущей координате, то есть locations/currentNS/currentWE.

Я ставлю слушателя на значения users/UID/location/ns users/UID/location/we, получаю текущие координаты и в этом же слушателе ставлю слушателя на узел locations/currentNS/currentWE. Проблема в том, что если побегать шаг вперед-назад, то методы onChildAdded, onChildRemoved и пр, запускаются по несколько раз. Если я 5 раз стану на 10 1, то на 5 шаге, методы запустятся по 5 раз каждый, хотя на данной ссылке всего 1 узел. Такое впечатление, что слушатели накапливаются по кол-ву шагов. Что я делаю не так?

Срабатывает при движении на север

public void onNorth(View view) {
Map<String, Object> update = new HashMap<>();
update.put("locations/"+ns+"/"+we+"/"+userId, null);
++ns;
update.put("users/" + userId + "/location/ns", ns);
update.put("locations/"+ns+"/"+we+"/"+userId, new User("Bot"));
mFirebaseDatabase.getReference().updateChildren(update);
}

Слушатель по значению, получает текущие координаты и запускает слушателя setListenerForCurrentLocation

mFirebaseDatabase = FirebaseDatabase.getInstance();
mReferenceLocation = mFirebaseDatabase.getReference("users/" + userId + "/location");
if (mValueEventListener == null) {
mValueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Location location = dataSnapshot.getValue(Location.class);
        ns = location.getNs();
        we = location.getWe();
        //Listener on current position(locations)
        setListenerForCurrentLocation(ns,we);
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
};
mReferenceLocation.addValueEventListener(mValueEventListener);}
mReferenceLocations = mFirebaseDatabase.getReference("locations/" + ns+"/"+we);

Метод setListenerForCurrentLocation, запускает слушатель на текущей координате :

public void setListenerForCurrentLocation(long ns, long we){
    mChildEventListenerLocations = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        Log.e("onChildAdded", dataSnapshot.getKey());
    }
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s){
            Log.e("onChildChanged", dataSnapshot.getKey());
    }
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
        Log.e("onChildRemoved", dataSnapshot.getKey());
    }
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        Log.e("onChildMoved", dataSnapshot.getKey());
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
};
mReferenceLocations.addChildEventListener(mChildEventListenerLocations);
}
READ ALSO
Конвертация BBcode в HTML [требует правки]

Конвертация BBcode в HTML [требует правки]

Пользователь должен ввести текст на языке BBCodeЭтот текст отправляется на сервер и возвращается на страницу в виде HTML

298
С# Инверсия байтов при маршалинге в структуру

С# Инверсия байтов при маршалинге в структуру

При попытке маршалинга бинарных данных в структуру происходит инверсия байтов внутри полей структуры те

234
Проверка на дубликаты c#

Проверка на дубликаты c#

Собственно есть файл с уникальными строками, их допустим 6кк, и есть вторая 2кк, нужно проверить базу 2кк на наличие в базе 6кк, и выдать только...

304