onDataChange的值返回null

时间:2016-09-16 13:34:36

标签: android firebase firebase-realtime-database

我试图从Firebase数据库中获取数据 我有两个碎片,一个用于注册,另一个用于登录 我将数据插入Firebase没有任何问题,但不知怎的,我无法从中返回数据

这些是我登录片段中的一些代码:

var
    express     = require('express'),
    path        = require('path'),
    app         = express();

//option 1 using path!
app.get('/', function( req, res ){

    res.sendFile( path.join(__dirname + '/index.html' ) );

})

//option 2 no path module.
app.get('/', function( req, res ){

    res.sendFile( __dirname + '/index.html' );

})

app.listen(8080);
console.log('app listens')

我在private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; @Override public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); } @Override public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } 方法中有这个代码:

onCreate

这是我 mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { user = firebaseAuth.getCurrentUser(); if(user != null) { getExistingUserInfo(user.getUid()); } };

query数据的方法
firebase

问题是,当我启动应用程序并在 public void getExistingUserInfo(String uid){ final FirebaseDatabase database = FirebaseDatabase.getInstance(); database.getReference("allUsers").child(uid) .orderByChild("emailAddress") .equalTo(mEmailStr) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Log.e("Data Changed YEA!",dataSnapshot.toString()); } @Override public void onCancelled(DatabaseError databaseError) { } }); 内调用getExistingUserInfo时,它会正确地从我的设备返回上次登录用户的数据

onCreate

但是当我按下登录时,它的值会返回null

> E/Data Changed YEA!: DataSnapshot { key =
> vWOypZ07sbeQKEtXnAwbEEV7ml43, value = {password=123456789,
> username=ahmed, sgl=true, emailAddress=ahmeddirect@gmail.com,
> studyGroupName=Study Group 2} }

所以我必须关闭应用程序并重新打开才能正确获取数据!!

这是用户登录的代码,它位于E/Data Changed YEA!: DataSnapshot { key = vWOypZ07sbeQKEtXnAwbEEV7ml43, value = null } clickListener方法中的onCreateView内:

mAuth.signInWithEmailAndPassword(mEmailStr, mPasswordStr).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(Task<AuthResult> task) {
                        if (task.isSuccessful())
{

 Toast.makeText(getContext(),"Succeed!",Toast.LENGTH_LONG).show();

                            }
                            else
                            {
                                Toast.makeText(getContext(),"Failed!",Toast.LENGTH_LONG).show();
                            }
                    }
                });

这就是我database的样子:

Click to see the Image

1 个答案:

答案 0 :(得分:1)

好吧,首先我不明白你为什么要使用AuthStateListener 删除onStartonStoponCreate中的代码 用此

替换getExistingUserInfo
public void getExistingUserInfo() {
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    String userID = user.getUid();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    database.getReference("allUsers").child(userID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            hashMap = (HashMap<String, String>) dataSnapshot.getValue();
            List<String> dataS = new ArrayList<>(hashMap.values());

            for (String data : dataS) {
                Log.e("Database Data", data);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

onClickListener按钮的signin内发布此方法,应该是

  

注意:如果您想对返回的数据执行任何操作,则应在返回数据后在onDataChange内执行此操作