2

I'm trying to validate a date in my app with firebase database. The situation is: I have a CalendarView, when I select a date, this date go to textview and when user click in button, I want to do the following validation if the date is in the database show a negative message, if the date isn't in the database save the date selected.

Here is the snippet of my code that is experiencing the error, the database and the error that appears.

On the android monitor, the error is

public class AgendarRecursoActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    String TAG = "AgendarRecursoActivity";
    String nomeRecurso;

    TextView txtData;
    CalendarView calendario;

    Recurso recurso;

    TextView txtNome;
    Button btnAgendarRecurso;
    Spinner recursoSpinner;

    FirebaseDatabase firebaseDatabase;
    DatabaseReference databaseReference;

    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_agendar_recurso);

        mAuth = FirebaseAuth.getInstance();

        FirebaseUser user = mAuth.getCurrentUser();

        //databaseReference = FirebaseDatabase.getInstance().getReference()
        //.child("recursos").child(user.getUid()).child("");

        calendario = (CalendarView) findViewById(R.id.calendarioRecurso);
        txtData = (TextView) findViewById(R.id.txtDataCalendario);
        txtNome = (TextView) findViewById(R.id.txtEmailUsuarioRecurso);
        btnAgendarRecurso = (Button) findViewById(R.id.btnAgendarRecurso);
        recursoSpinner = (Spinner) findViewById(R.id.spinner);

        txtNome.setText(user.getEmail());
        //txtData.setText("Data");

        databaseReference = FirebaseDatabase.getInstance().getReference();

        databaseReference.child("recursos").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                final List<String> recursoNome = new ArrayList<String>();

                for (DataSnapshot recursoSnapshot : dataSnapshot.getChildren()) {
                    //Pega título do nó
                    String recursoSnap = recursoSnapshot.getKey();

                    //Adiciona na lista
                    recursoNome.add(recursoSnap);
                }

                //Pega lista e poe no spinner
                ArrayAdapter<String> recursosAdapter = new ArrayAdapter<String>(AgendarRecursoActivity.this, android.R.layout.simple_spinner_item, recursoNome);
                recursosAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                recursoSpinner.setAdapter(recursosAdapter);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        calendario.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
                String date = dayOfMonth + "/" + (month + 1) + "/" + year;
                Log.d(TAG, "onSelectedDayChange: " + date);

                txtData.setText(date);
            }
        });

        btnAgendarRecurso.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                recurso = new Recurso();
                recurso.setNomeUsuario(txtNome.getText().toString());
                recurso.setDataRecurso(txtData.getText().toString());
                recurso.setNomeRecurso(recursoSpinner.getSelectedItem().toString());

                DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
                FirebaseUser user = mAuth.getCurrentUser();

                databaseReference.child("recursos").child(recursoSpinner.getSelectedItem().toString()).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        for(DataSnapshot snapshot: dataSnapshot.getChildren()) {

                            if(snapshot.child("dataRecurso").getValue().toString().equals(recurso.getDataRecurso())){  //error in android monitor is here

                                Toast.makeText(AgendarRecursoActivity.this, "Data indisponível", Toast.LENGTH_SHORT).show();

                            }

                            else{

                                reservarRecurso();

                            }

                        }

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });



            }
        });
    }

    public void reservarRecurso(){

        databaseReference.child("recursos").child(recursoSpinner.getSelectedItem().toString()).push().setValue(firebaseDatabase, new DatabaseReference.CompletionListener() {
            @Override
            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                //Problem with saving the data
                if (databaseError != null) {
                    Toast.makeText(AgendarRecursoActivity.this, "Erro ao agendar recurso! Data não disponível", Toast.LENGTH_LONG).show();
                } else {
                    //Data uploaded successfully on the server
                    databaseReference.child("nomeUsuario").setValue(txtNome.getText().toString());
                    databaseReference.child("dataRecurso").setValue(txtData.getText().toString());
                    Toast.makeText(AgendarRecursoActivity.this, "Recurso agendado com sucesso!", Toast.LENGTH_LONG).show();
                    retornaTela();
                }
            }
        });

    }

    public void agendar(View v) {
        calendario = (CalendarView) findViewById(R.id.calendarioRecurso);
        SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
        String dataRecurso = formatoData.format(new Date(calendario.getDate()));

    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        nomeRecurso = parent.getItemAtPosition(position).toString();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    public void retornaTela(){
        Intent intent = new Intent(this,MenuActivity.class);
        startActivity(intent);
    }

}

Android monitor error

JSON Exported database

{
  "recursos" : {
    "Churrasqueira" : {
      "-KvyL-Lqbk_2laoU6dHZ" : {
        "dataRecurso" : "11/10/2017",
        "nomeRecurso" : "Churrasqueira",
        "nomeUsuario" : "d@d.com"
      },
      "-KvyQ1a0gkG-OYO4ru1-" : {
        "dataRecurso" : "19/10/2017",
        "nomeUsuario" : "d@d.com"
      },
      "-KvyZDPRNWOX4AJS3t2U" : {
        "dataRecurso" : "26/10/2017",
        "nomeUsuario" : "d@d.com"
      },
      "-Kw3HlJJGZeilpKZBhr8" : {
        "dataRecurso" : "11/10/2017",
        "nomeUsuario" : "d@d.com"
      }
    },
    "Escada" : {
      "-KvyMACClT8TnSU53NnT" : {
        "dataRecurso" : "12/10/2017",
        "nomeRecurso" : "Escada",
        "nomeUsuario" : "d@d.com"
      },
      "-Kw016X_JxFzzZ9lSzS2" : {
        "dataRecurso" : "17/10/2017",
        "nomeUsuario" : "sthomazdasilva@gmail.com"
      }
    },
    "Salão de festas" : {
      "-KvyMDjHdL314aki28EI" : {
        "dataRecurso" : "27/10/2017",
        "nomeRecurso" : "Salão de festas",
        "nomeUsuario" : "d@d.com"
      }
    }
  }
}

Can help me, please?

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
D.Almeida
  • 75
  • 2
  • 6
  • Please replace the screenshots of text with the actual text. In the case of the JSON you can get this by clicking the "Export JSON" link in your [Firebase Database console](https://console.firebase.google.com/project/_/database/data). – Frank van Puffelen Oct 10 '17 at 03:46
  • @FrankvanPuffelen Inserted JSON database. – D.Almeida Oct 10 '17 at 11:30
  • I don't immediately see where this data would cause the code to raise a null pointer exception. The best next step is to run the code in a your Android Studio debugger and see what data it's looping through when it throws the error. See https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – Frank van Puffelen Oct 10 '17 at 13:47

0 Answers0