如何检查Firebase数据库中是否有特定用户的数据?(Android/Java)

如何检查Firebase数据库中是否有特定用户的数据?(Android/Java),java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,当用户在我的android应用程序上使用firebase创建帐户时,他们需要被引导到一个屏幕,在那里他们可以添加一些单独的信息,例如用户名。应用程序知道通过AuthStateListener切换活动,因此,当创建帐户或有人在此处登录代码时,会执行此操作(此处目前没有更改意图,请继续阅读以了解原因): 在检查用户是否不等于null的if块中,我需要将意图更改为另一个活动,他们将在其中输入用户名。基本上,逻辑是,如果用户已经有用户名,并且他们刚刚登录,那么他们将被引导到主屏幕活动,如果他们正在注册,

当用户在我的android应用程序上使用firebase创建帐户时,他们需要被引导到一个屏幕,在那里他们可以添加一些单独的信息,例如用户名。应用程序知道通过AuthStateListener切换活动,因此,当创建帐户或有人在此处登录代码时,会执行此操作(此处目前没有更改意图,请继续阅读以了解原因):

在检查用户是否不等于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) {

            }
        });

它使用数据快照。问题是,此代码仅在向数据库添加数据时才会触发,因此,当用户只是注册并且从未向数据库添加用户名时,此方法不会执行任何代码。如何查询数据库中的数据以检查某个用户是否有任何数据?

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

要检查用户是否已经有用户名,请在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) {

                }
            });
        }
在本例中,如果用户_bio存在,则将文本设置为userbio(如果不存在,则什么也不做)。在用户第一次登录我的应用程序时,此方法不执行任何操作,但在用户添加bio时,此方法在userbio文本中设置bio文本。但是如果我想在用户没有bio时显示一些文本,我只需添加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) {

                }
            });
        }

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) {

                }
            });
        }
在本例中,如果用户_bio存在,则将文本设置为userbio(如果不存在,则什么也不做)。在用户第一次登录我的应用程序时,此方法不执行任何操作,但在用户添加bio时,此方法在userbio文本中设置bio文本。但是如果我想在用户没有bio时显示一些文本,我只需添加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) {

                }
            });
        }

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


如果在onCreate方法中的侦听器运行活动,则在打开活动时将触发该活动一次。因此,我认为您不应该在这里遇到问题。

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


如果在onCreate方法中的侦听器运行活动,则在打开活动时将触发该活动一次。因此,我认为您不应该在这里遇到问题。

我理解这一点,但如果由于用户未输入任何内容而未对数据进行任何处理,则不会触发此操作,这是没有理由的。因此,为了帮助您,我解释了我在某个应用程序中使用的一种方法。啊,好的,我现在明白了!这非常有效,谢谢大家。我很理解这一点,但如果用户没有输入任何内容,因此根本没有做任何数据处理,那么这将不会启动,它没有理由启动。因此,为了帮助大家,我解释了我在我的一个应用程序中使用的一种方法。啊,好的,我现在明白了!这非常好,非常感谢。上面的mRef.addValueEventListener是onCreate,但是在以某种方式添加或删除数据之前,onDataChange中的方法不会被执行,因此如果有人还没有向数据库添加任何信息,这段代码将永远不会执行。嗯,这很奇怪,我不知道是什么问题,但我认为您应该尝试调试,看看问题到底出在哪里,因为我一直使用onDataChange从数据库调用数据,即使数据没有更改、添加或删除,因为它已经触发一次,以便为我检索数据。是的,上面的mRef.addValueEventListener处于onCreate中,但是onDataChange中的方法在数据以某种方式被添加或删除之前是不会执行的,所以如果有人还没有向数据库添加任何信息,这段代码将永远不会执行。嗯,这很奇怪,我不知道哪里出了问题,但我认为您应该尝试调试,看看问题到底出在哪里,因为我一直使用onDataChange从数据库中调用数据,即使数据没有更改、添加或删除,因为它已经触发一次为我检索数据。。