参数’pathString’为null

我在firebase中执行查询时遇到错误,我的查询代码如下所示:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_perfil); txtNome = (TextView) findViewById(R.id.txtNomePerfil); txtCpf = (TextView) findViewById(R.id.txtCpfPerfil); txtEmail = (TextView) findViewById(R.id.txtEmailPerfil); txtFone = (TextView) findViewById(R.id.txtCelularPerfil); txtPlaca = (TextView) findViewById(R.id.txtPlacaPerfil); imgPerfil = (ImageView) findViewById(R.id.imgPerfil); txtNomeFantasia = (TextView) findViewById(R.id.txtNomeFantasiaPerfil); txtCnpj = (TextView) findViewById(R.id.txtCnpjPerfil); firebaseUser = firebaseAuth.getInstance().getCurrentUser(); uId = firebaseUser.getUid(); email = firebaseUser.getEmail(); txtEmail.setText(email); databaseReference = FirebaseDatabase.getInstance().getReference(); databaseReference.child("Usuario").child(uId).child("nome") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { nome = dataSnapshot.getValue(String.class); txtNome.setText(nome); } @Override public void onCancelled(DatabaseError databaseError) { } }); DatabaseReference mReferenceCpf = FirebaseDatabase.getInstance().getReference(); databaseReference.child("Usuario").child(uId).child("cnpjCpf") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { cpf = dataSnapshot.getValue(String.class); txtCpf.setText(cpf); } @Override public void onCancelled(DatabaseError databaseError) { } }); DatabaseReference mReferencePlaca = FirebaseDatabase.getInstance().getReference(); mReferencePlaca.child("Funcionario").child(cpf).child("placa") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { placa = dataSnapshot.getValue(String.class); txtPlaca.setText(placa); } @Override public void onCancelled(DatabaseError databaseError) { } }); 

但是我收到以下错误:

exceptionjava.lang.RuntimeException:无法启动活动ComponentInfo {ucarparceiro.ucarapp.com.ucarparceiro / ucarparceiro.ucarapp.com.ucarparceiro.Activity.ActivityPrincipal.ActivityPerfil}:java.lang.NullPointerException:无法为参数’传递null child()中的pathString’( android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376)android.app.ActivityThread.access $ 800(ActivityThread.java:147)android .app.ActivityThread $ H.handleMessage(ActivityThread.java:1281)android.os.Handler.dispatchMessage(handler.java:102)android.os.Looper.loop(Looper.java:135)android.app.ActivityThread.main (ActivityThread.java:5253)java.lang.reflect.Method.invoke(Method.java)java.lang.reflect.Method.invoke(Method.java:372)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Firebase中的数据如下:

用户 员工

您最有可能收到错误,因为当您在mReferenceplaca其用作子项时, cpf为null。 这是因为Firebase异步下载数据并且您的代码行是同步执行的。 因此,当执行此行mReferencePlaca.child("Funcionario").child(cpf).child("placa")cpf的值仍然为null,因为这个cpf = dataSnapshot.getValue(String.class); 还没有发生。

要解决这个问题,请更改: –

  DatabaseReference mReferenceCpf = FirebaseDatabase.getInstance().getReference(); databaseReference.child("Usuario").child(uId).child("cnpjCpf") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { cpf = dataSnapshot.getValue(String.class); txtCpf.setText(cpf); } @Override public void onCancelled(DatabaseError databaseError) { } }); DatabaseReference mReferencePlaca = FirebaseDatabase.getInstance().getReference(); mReferencePlaca.child("Funcionario").child(cpf).child("placa") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { placa = dataSnapshot.getValue(String.class); txtPlaca.setText(placa); } @Override public void onCancelled(DatabaseError databaseError) { } }); 

对此: –

 DatabaseReference mReferenceCpf = FirebaseDatabase.getInstance().getReference(); databaseReference.child("Usuario").child(uId).child("cnpjCpf") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { cpf = dataSnapshot.getValue(String.class); txtCpf.setText(cps); DatabaseReference mReferencePlaca = FirebaseDatabase.getInstance().getReference(); mReferencePlaca.child("Funcionario").child(cpf).child("placa") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { placa = dataSnapshot.getValue(String.class); txtPlaca.setText(placa); } @Override public void onCancelled(DatabaseError databaseError) { } }); } @Override public void onCancelled(DatabaseError databaseError) { } }); 

要解决您的问题,只需在相应的onDataChange()方法中声明nomecpfonDataChange()字符串,否则为null,因为异步行为。

例如,请使用以下代码:

 public void onDataChange(DataSnapshot dataSnapshot) { String nome = dataSnapshot.getValue(String.class); TextView txtNome = (TextView) findViewById(R.id.txtNomePerfil); txtNome.setText(nome); } 

以同样的方式,您需要进行其他更改。

 private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; 

在onCreate()方法中,初始化FirebaseAuth实例和AuthStateListener方法,以便您可以在用户登录或注销时进行跟踪。

 mAuth = FirebaseAuth.getInstance(); 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()); } else { // User is signed out Log.d(TAG, "onAuthStateChanged:signed_out"); } // ... } 

};

将侦听器附加到onStart()方法中的FirebaseAuth实例,并在onStop()上将其删除。

  public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); 

}

 public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } 

}

https://firebase.google.com/docs/auth/android/start/?hl=es-419