我在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) {
}
});
但是我收到以下错误:
异常java.lang.RuntimeException:无法启动活动ComponentInfo {ucarparceiro.ucarapp.com.ucarparceiro / ucarparceiro.ucarapp.com.ucarparceiro.Activity.ActivityPrincipal.ActivityPerfil}:java.lang.NullPointerException:Can&# 39; t为参数传递null' pathString' in child() 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中的数据如下:
答案 0 :(得分:4)
您最有可能收到错误,因为cpf
在mReferenceplaca
中将其用作孩子时为空。这是因为Firebase异步下载数据并且您的代码行是同步执行的。因此,在执行此行mReferencePlaca.child("Funcionario").child(cpf).child("placa")
时,cpf
的值仍然为空,因为此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) {
}
});
答案 1 :(得分:1)
要解决您的问题,只需在相应的nome
方法中声明cpf
,placa
和onDataChange()
字符串,否则由于异步行为而为空。
例如,请使用此代码:
public void onDataChange(DataSnapshot dataSnapshot) {
String nome = dataSnapshot.getValue(String.class);
TextView txtNome = (TextView) findViewById(R.id.txtNomePerfil);
txtNome.setText(nome);
}
以同样的方式,您需要进行其他更改。
答案 2 :(得分:0)
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
答案 3 :(得分:0)
不确定此解决方案是否对其他人有帮助。
背景: 我正在使用 Intent Parcel 设置 firebase 路径值。
解决方案: 通过将 androidmenifest 更新为添加“singleInstance”
解决了此问题 <activity android:name=".yourActivity"
android:launchMode="singleInstance"
android:parentActivityName=".MainActivity">