当用户在我的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。这个问题是这个代码只在数据添加到数据库时被触发,因此当用户只是注册并且从未向数据库添加用户名时,此方法将不会执行任何代码。如何查询数据库中的数据只是为了检查某个用户是否有任何数据?
答案 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方法内部的监听器中运行一个活动,它会在你打开一个活动时触发一次。所以我认为你不应该有问题。