尝试检查用户登录是否存在于数据库中,但在第一次运行时 addListenerForSingleValueEvent
不会触发。
private void signInWithPhoneAuthCredentials(PhoneAuthCredential phoneAuthCredential) {
FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()) {
//String dbUrl = "https://doctalk-f0b75-default-rtdb.europe-west1.firebasedatabase.app/";
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(user!= null){
//final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReferenceFromUrl(dbUrl).child("user").child(user.getUid());
final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReference().child("user").child(user.getUid());
Log.v(TAG, mUserDB.toString());
mUserDB.addListenerForSingleValueEvent(new ValueEventListener() {
String path = mUserDB.getRef().toString();
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (!snapshot.exists()) {
Map<String, Object> userMap = new HashMap<>();
userMap.put("phone", user.getPhoneNumber());
userMap.put("name", user.getDisplayName());
mUserDB.updateChildren(userMap);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) { throw error.toException();}
});
mUserDB.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (!snapshot.exists()) {
Map<String, Object> userMap = new HashMap<>();
userMap.put("phone", user.getPhoneNumber());
userMap.put("name", user.getDisplayName());
mUserDB.updateChildren(userMap);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) { throw error.toException(); }
});
}
}
userIsLoggedIn();
}
});
}
不知道为什么...
更新:
我认为与位置和数据库网址有关。
我得到 db url = https://app-name-default-rtdb.firebaseio.com/
控制台上的 db url 在哪里 https://app-name-default-rtdb.europe-west1.firebasedatabase.app/
正如 google docs 中提到的:
<块引用>注意:要获取对 us-central1 以外的数据库的引用 默认 dstabase,您必须将数据库 URL 传递给 getInstance()(或 Kotlin+KTX 数据库())。对于 us-central1 默认数据库,您可以 不带参数调用 getInstance()(或数据库)。
您可以在实时数据库中找到您的实时数据库 URL Firebase 控制台的部分。它将具有以下形式 https://.firebaseio.com(适用于 us-central1 数据库)或 https://.firebasedatabase.app(用于数据库 所有其他位置)。
答案 0 :(得分:0)
也许,你的:
<块引用>FirebaseUser 用户 = FirebaseAuth.getInstance().getCurrentUser();
和
<块引用>最终数据库参考 mUserDB = FirebaseDatabase.getInstance().getReference().child("user").child(user.getUid());
没拍好
答案 1 :(得分:0)
Firebase 实时数据库现在有两个位置。
US DB URL 是旧的,而比利时 URL 包含一个额外的节点。 如果您的 firebase 控制台包含比利时 URL,则意味着您在比利时创建了一个数据库实例。所以重新下载谷歌服务JSON文件并使用它。