null for argument 'pathString'

15,562

Solution 1

You're most likely getting an error because cpf is null when you use it as a child in mReferenceplaca. This happens because Firebase downloads data asynchronously and your code lines are executed synchronously. Therefore, by the time this line mReferencePlaca.child("Funcionario").child(cpf).child("placa") is executed, the value of cpf is still null because this cpf = dataSnapshot.getValue(String.class); hasn't happened yet.

To solve this, change this :-

    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) {

                }
            });

to this :-

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) {

            }
        });

Solution 2

To solve your problem, just declare nome, cpf and placa Strings inside the coresponding onDataChange() methods, otherwise is null, due the asynchronous behaviour.

As an example, please use this code:

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

In the same way, you need to make the other changes.

Share:
15,562
Y. Sampaio
Author by

Y. Sampaio

Updated on June 04, 2022

Comments

  • Y. Sampaio
    Y. Sampaio almost 2 years

    I am having an error when I perform queries in firebase, my code for query looks like this:

    @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) {
    
                    }
                });
    

    However I am getting the following error:

    Exception java.lang.RuntimeException: Unable to start activity ComponentInfo{ucarparceiro.ucarapp.com.ucarparceiro/ucarparceiro.ucarapp.com.ucarparceiro.Activity.ActivityPrincipal.ActivityPerfil}: java.lang.NullPointerException: Can't pass null for argument '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)

    The data in Firebase is as follows:

    User Employee