Удалить дочернюю базу Firebase, если пользователь не активен - PullRequest
0 голосов
/ 17 октября 2018

У меня есть пользователь, создающий игровую комнату в firebase.Если другой пользователь присоединится к игре, все в порядке.Моя проблема в том, что «создатель» может выйти из приложения, закрыть приложение или не находится в игре, когда присоединяется другой пользователь.Так что я хочу, чтобы в этом случае игровая комната была удалена из базы.Я делаю это с помощью следующего кода:

    public void removeGameFromWaitQueue() {
            DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
            if (mCurrentGame.getState() == DatabaseModels.Game.State.JOINED.ordinal()){
//do nothing

            }
            else
                data.removeValue();
        } 

Моя проблема в том, что когда я добавляю код в onStop () и onDestroy (), игра, конечно, удаляется, но даже если присоединяется другой игрокигра и переход к игровой активности собственно вызывается onStop () и onDestroy, поэтому игра снова удаляется.Есть ли другой способ удалить игру, если создатель завершил действие, но не если приложение перейдет к следующему действию?

РЕДАКТИРОВАТЬ

Я немного изменил код, например:

public void removeGameFromWaitQueue() {
        final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
        data.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
                        data.removeValue();
                }
            }


                }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

        });

Таким образом, когда состояние mCurrentGame открыто, я могу удалить игру.Проблема сейчас в том, что if (snapshot.exists ()) не работает, так как я получаю Null Exception после запуска игры.Что-то не так с кодом?То есть снимок проверяет mCurrentGame или я не прав?

ОБНОВЛЕНИЕ

Мне удается заставить код работать так, как мне нужно, вот так:

@Override
    protected void onStop() {
        super.onStop();
        if(mCurrentGame!=null) {
            removeGameFromWaitQueue();
        }
        // un-subscribe the listeners
        if (mCreatedGamesListener != null) {
            mGamesDatabaseRef.removeEventListener(mCreatedGamesListener);
        }
        if (mJoinedGamesListener != null) {
            mGamesDatabaseRef.removeEventListener(mJoinedGamesListener);
        }
    }
    public void removeGameFromWaitQueue() {
        final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
        data.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    mCurrentGame = snapshot.getValue(DatabaseModels.Game.class);
                    if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
                        data.removeValue();
                }

            }

                }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

        });

    }

Трудно предсказать каждый«ненормальное» поведение пользователя, поэтому теперь моя проблема в том, что мне нужно ВСЕ это в проверке IF, что ВСЕ данные DatabaseReference существуют.Как и во многих случаях вызывается onStop (), если мой пользователь входит в действие, но он НЕ создает игру, то DatabaseRerence будет пустым.Таким образом, вызов данных вызывает исключение.Так, как я могу проверить, существует ли DatabaseReference ИЛИ, если он был создан?

...