【问题标题】:How can I check if my Firebase database has data for a certain user? (Android/Java)如何检查我的 Firebase 数据库是否有特定用户的数据? (安卓/Java)
【发布时间】:2017-07-16 19:13:32
【问题描述】:

当用户在我的 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) {

            }
        });

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

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    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 文本。但是如果我想在用户没有 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) {
    
                    }
                });
            }
    

    【讨论】:

    • 我理解这一点,但如果因为用户没有输入任何内容而根本没有对数据进行任何操作,那么这不会触发,也没有理由触发。
    • 所以为了帮助你,我解释了我在我的一个应用程序中使用的一种方法。
    • 啊好的,我现在明白了!这非常有效,非常感谢您
    【解决方案2】:

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

    如果您在 onCreate 方法中的侦听器运行活动时,它会在您打开活动时触发一次。所以我认为你在这里应该没有问题。

    【讨论】:

    • 是的,上面的mRef.addValueEventListener在onCreate中,但是里面的方法onDataChange不会执行,直到数据以某种方式添加或删除,所以如果有人没有添加,这段代码永远不会执行数据库中的任何信息。
    • 嗯,这很奇怪,我不知道出了什么问题,但我认为您应该尝试调试以查看问题到底出在哪里,因为我一直使用 onDataChange 来调用数据库中的数据,甚至是数据没有更改、添加或删除,因为它已经被触发一次来为我检索数据..
    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2018-06-02
    • 2020-10-15
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多