如果用户不活跃,请删除Firebase子级

时间:2018-10-16 22:24:56

标签: android firebase android-activity firebase-realtime-database

我有一个用户在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是否存在或是否已创建?

0 个答案:

没有答案