如何检查Firebase数据库是否包含特定用户的数据? (机器人/爪哇)

时间:2017-07-16 19:13:33

标签: java android firebase firebase-realtime-database firebase-authentication

当用户在我的Android应用程序上使用firebase创建帐户时,他们需要被定向到一个屏幕,在那里他们可以添加一些单独的信​​息,例如用户名。该应用程序知道通过AuthStateListener切换活动,所以当一个帐户被创建或有人登录这里的代码时(这里没有改变意图,请继续阅读以了解原因):

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    userID = user.getUid();
                    toastMessage("User has signed in: " + user.getEmail());


                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };

在检查用户是否不等于null的if块中,我需要将意图更改为另一个活动,在那里他们将输入用户名。基本上逻辑是,如果用户已经拥有用户名并且他们刚刚登录,则他们将被定向到主屏幕活动,如果他们正在注册,则需要将他们定向到他们创建用户名的活动。要知道我需要将它们发送到哪个活动,我需要让代码查看firebase数据库,看看他们的帐户是否已经有用户名。在这种情况下,我无法弄清楚如何从firebase读取数据,似乎从数据库中读取的唯一方法(根据其他人)是通过onDataChange方法,如下所示:

        mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.d(TAG, "This: "+dataSnapshot.getValue());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

使用dataSnapshots。这个问题是这个代码只在数据添加到数据库时被触发,因此当用户只是注册并且从未向数据库添加用户名时,此方法将不会执行任何代码。如何查询数据库中的数据只是为了检查某个用户是否有任何数据?

2 个答案:

答案 0 :(得分:3)

如果用户添加数据,删除数据,更改数据等,则会在所有情况下触发

OnDatachange

要检查用户是否已拥有用户名 OnDatachange

if(dataSnapshot.exists()){
//GO TO OTHER ACTIVITY
]else{
//GO TO SET USER DATA ACTIVITY
]

请参阅我的一个实现的例子:

if (user !=null){
            DatabaseReference myRef = database.getReference("users").child(user.getUid()).child("user_bio");

            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()){
                        bio.setText(dataSnapshot.getValue(String.class));

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

在此示例中,如果user_bio存在,则将文本设置为userbio,如果不执行任何操作。在用户第一次登录我的应用程序时,此方法什么都不做,但是当用户添加bio时,此方法会在userbio文本中设置生物文本。但如果我想显示一些文本,如果用户没有生物我只需添加na else并将文本设置为bio例如:

if (user !=null){
            DatabaseReference myRef = database.getReference("users").child(user.getUid()).child("user_bio");

            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()){
                        bio.setText(dataSnapshot.getValue(String.class));
                    }else{
                        bio.setText("no user bio");
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

答案 1 :(得分:1)

您是否尝试在onCreate方法中使用addValueEventListener?

如果你在onCreate方法内部的监听器中运行一个活动,它会在你打开一个活动时触发一次。所以我认为你不应该有问题。