参数为null' pathString'

时间:2017-07-13 17:59:37

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

我在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中的数据如下:

User Employee

4 个答案:

答案 0 :(得分:4)

您最有可能收到错误,因为cpfmReferenceplaca中将其用作孩子时为空。这是因为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方法中声明cpfplacaonDataChange()字符串,否则由于异步行为而为空。

例如,请使用此代码:

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">