addListenerForSingleValueEvent 不会触发

时间:2021-03-08 20:08:43

标签: android firebase firebase-realtime-database

尝试检查用户登录是否存在于数据库中,但在第一次运行时 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(用于数据库 所有其他位置)。

2 个答案:

答案 0 :(得分:0)

也许,你的:

<块引用>

FirebaseUser 用户 = FirebaseAuth.getInstance().getCurrentUser();

<块引用>

最终数据库参考 mUserDB = FirebaseDatabase.getInstance().getReference().child("user").child(user.getUid());

没拍好

答案 1 :(得分:0)

Firebase 实时数据库现在有两个位置。

  1. 美国
  2. 比利时

US DB URL 是旧的,而比利时 URL 包含一个额外的节点。 如果您的 firebase 控制台包含比利时 URL,则意味着您在比利时创建了一个数据库实例。所以重新下载谷歌服务JSON文件并使用它。