簡體   English   中英

如何檢查我的Firebase數據庫是否具有特定用戶的數據? (Android / Java)

[英]How can I check if my Firebase database has data for a certain user? (Android/Java)

當用戶在我的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");
                }
                // ...
            }
        };

在if塊中,它檢查用戶是否等於null,這是我需要將意圖更改為另一個活動的地方,他們將在其中輸入用戶名。 基本上,邏輯是,如果用戶已經有一個用戶名並且正在登錄,那么他們將被定向到主屏幕活動,如果他們正在注冊,則需要被定向到創建用戶名的活動。 要知道我需要將其發送給哪個活動,我需要在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。 問題在於,僅當將數據添加到數據庫時才觸發此代碼,因此,當用戶只是注冊並且從未向數據庫添加用戶名時,此方法將不會執行任何代碼。 我該如何查詢以查看數據庫中的數據,只是檢查某個用戶那里是否有任何數據?

在所有情況下都會觸發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文本中設置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方法中的偵聽器中運行活動,則在打開活動時將觸發一次。 所以我認為您在這里應該不會有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM