Java 每当我试图从Firebase获取用户名时,它都会返回值,但不会以字符串形式更新

Java 每当我试图从Firebase获取用户名时,它都会返回值,但不会以字符串形式更新,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,这是我的登录活动。每当我点击登录按钮,它就会成功地让我登录。另一方面,我也在尝试从数据库中获取用户名和配置文件名,它会成功地完全返回值。主要问题是,当Firebase返回值时,它并没有更新到我的字符串中,并且每当我试图检索它时,它都显示为null public class LoginActivity extends AppCompatActivity { FirebaseAuth firebaseAuth = FirebaseAuth.getInstance (); Fireb

这是我的登录活动。每当我点击登录按钮,它就会成功地让我登录。另一方面,我也在尝试从数据库中获取用户名和配置文件名,它会成功地完全返回值。主要问题是,当Firebase返回值时,它并没有更新到我的字符串中,并且每当我试图检索它时,它都显示为null

public class LoginActivity extends AppCompatActivity {

    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance ();
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference ();
    String[] z= {""};
    EditText email,password;
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_login);
        email = findViewById (R.id.editUser);
        password = findViewById (R.id.editPass);
        final SharedPreferences sharedPreferences = getSharedPreferences ("Login", MODE_PRIVATE);
        final SharedPreferences sharedPreferences2 = getSharedPreferences ("isLoginned", MODE_PRIVATE);
        final SharedPreferences.Editor editor = sharedPreferences.edit ();
        final SharedPreferences.Editor editor2 = sharedPreferences2.edit ();
        Button signin = findViewById (R.id.signin);
        final ProgressDialog dialog = new ProgressDialog (LoginActivity.this);

        dialog.setMessage ("Loging in.  Please wait");
        dialog.setTitle ("Login User");
        dialog.setCancelable (false);
        signin.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View view) {
                dialog.show ();
                if(!email.getText ().toString ().equals (null) && !password.getText ().toString ().equals (null)){
                    firebaseAuth.signInWithEmailAndPassword (email.getText ().toString (),password.getText ().toString ()).addOnCompleteListener (new OnCompleteListener<AuthResult> () {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if(task.isSuccessful ()){
                                int a = email.getText ().toString ().indexOf ("@");
                                SplashScreen.USERNAME = email.getText ().toString ().substring (0,a);
                                myRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        DataSnapshot snapshot = dataSnapshot.child ("User").child (SplashScreen.USERNAME);
                                        DataSnapshot usernamee = snapshot.child ("Username");
                                        DataSnapshot name = snapshot.child ("Name");
                                        SplashScreen.IDNAME = String.valueOf (usernamee.getValue ());
                                        SplashScreen.NAME = String.valueOf (name.getValue ());
                                        editor.putString ("ussername", SplashScreen.IDNAME);
                                        editor.putString ("name", SplashScreen.NAME);
                                        editor.apply ();
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError error) {
                                        Toast.makeText (LoginActivity.this, error.getMessage (), Toast.LENGTH_SHORT).show ();
                                    }
                                });
                                dialog.dismiss ();
                                editor.putString ("Email",email.getText ().toString ());
                                editor.putString ("pass",password.getText ().toString ());
                                editor.putString ("Username",SplashScreen.USERNAME);
                                editor2.putString ("login","Yes");
                                editor.apply ();
                                editor2.apply ();
                                editor.commit ();
                                editor2.commit ();
                                Intent intent = new Intent (LoginActivity.this, WallOfTheApp.class);
                                startActivity (intent);
                                finish ();
                            }
                        }
                    }).addOnFailureListener (new OnFailureListener () {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            dialog.dismiss ();
                            Toast.makeText (LoginActivity.this, e.getMessage (), Toast.LENGTH_SHORT).show ();
                        }
                    });
                }
            }
        });
    }
}
这是我的Firebase数据库:

{
  "User" : {
    "prathamkhurana43" : {
      "Mobile Number" : "1234567890",
      "Name" : "Pratham",
      "Username" : "prathamk22"
    }
  }
}
每当我第一次单击按钮时,它不会得到值,而是打开 第二次单击“登录”按钮可获取 用户名和配置文件名

试试这个:

DatabaseReference myRef = database.getReference();
myRef.child("User").addValueEventListener(new ValueEventListener() {
     @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnasphot datas: dataSnapshot.getChildren()){
    String names=datas.child("Name").getValue().toString();
    String usernames=datas.child("Username").getValue().toString();
    editor.putString ("ussername",names);
    editor.putString ("name", usernames);
    editor.apply();
   }
这将为您提供可在共享首选项中使用的值
name
username

如果您有此值
“prathamkhurana43”
,您也可以这样做:

myRef.child("User").child("prathamkhurana43").addValueEventListener(new ValueEventListener() {
  //retrieve data without using the for loop

Yaa每当我在successfull语句中使用log时,它都会在log中显示名称,但当我尝试使用string访问该名称时,它会返回nullcheck,检查您是否输入了错误编辑器.putString(“ussername”,SplashScreen.IDNAME);尝试使用editor.putString(“用户名”,SplashScreen.IDNAME);我之前尝试过,但没有帮助请显示数据库firebase数据库??我不能简单地使用电子邮件,因为用户将输入电子邮件,然后应用程序将检索firebase数据库的名称和用户名什么电子邮件@Prathamkhuranana如果你是指这个
Prathamkhuranana43
,那么只需输入用户在child中输入的值(//在这里),或者只需执行第一种迭代方式,它就不起作用了,我想问题是,当我单击登录按钮时,应用程序获取字符串的上一个值,从数据库获取值后,它更新字符串变量,当我单击“登录”按钮上的其他时间时,它会成功工作。我希望它只在第一次工作。当您单击“登录”按钮时,请不要获取上一个值并仅从数据库获取该值,以便它只在第一次工作
myRef.child("User").child("prathamkhurana43").addValueEventListener(new ValueEventListener() {
  //retrieve data without using the for loop