2017-01-23 4 views
0

Verwenden der Firebase-Datenbank. Ich habe eine Datenbank, die die Registrierungsinformationen für Patienten speichert. Beim Registrieren eines neuen Patienten überprüfe ich, ob die Person bereits registriert ist oder nicht.Funktion addListenerForSingleValueEvent von firebase

Die folgende Funktion prüft, ob eine Registrierung für diese Person bereits erfolgt ist oder nicht. Ich überprüfe das, indem ich auf "Benutzer/Phone_no/Patient_name" gehe. Wenn der DataSnapshot nicht null ist, ist die Registrierung bereits vorhanden.

private boolean checkAlreadyRegistered(){ 

    final boolean[] alreadyRegistered = {false}; 
    /*Get the reference*/ 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users/" + childDetails.getPhone() + "/" + childDetails.getPatientName()); 
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d(TAG, "onDataChange: " + dataSnapshot); 
      if (dataSnapshot.getValue() != null) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
       builder.setTitle("Record Already Exists"); 
       builder.setMessage("The current patient is already registered"); 
       builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 

         alreadyRegistered[0] = true; 
        } 
       }); 
       builder.create(); 
       builder.show(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

      Toast.makeText(getContext(), "Some error occured", Toast.LENGTH_LONG).show(); 
     } 
    }); 
    return alreadyRegistered[0]; 
} 

Von saveInDatabase Ich rufe die obige Funktion

void saveInDatabase(Long patient_id) { 


    boolean alreadyRegistered = checkAlreadyRegistered(); 
    if (alreadyRegistered) { 
     resetRegisterFields(); 
     return; 
    } 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Current_registered_users"); 
    mDatabaseReference.setValue(patient_id + 1); 
    childDetails.setPatient_id(patient_id); 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users"); 
    Log.d(TAG, "saveInDatabase: "+mDatabaseReference); 
    mDatabaseReference.child(childDetails.getPhone()).child(childDetails.getPatientName()).child("Registration Details").setValue(childDetails); 
    Button bt = (Button) getView().findViewById(R.id.buttonRegister); 
    resetRegisterFields(); 
    progressDialog.dismiss(); 
    displayPid(patient_id); 
    bt.setEnabled(true); 
    . 
    . 
} 

Was will ich prüfen tun-, wenn eine Registrierung auf der Grundlage PHONE_NO/Patient_name bereits oder nicht gemacht wird, wenn nicht die Details speichern.

Problem - Wenn eine neue Registrierung vorgenommen wird, wird es zur Datenbank hinzugefügt, aber danach wird die Meldung "..Already registered" von checkAlreadyRegistered() -> onDataChange angezeigt.

Warum kommt diese Nachricht und wie lösen Sie sie?

+0

'onDataChange()' wird asynchron ausgelöst. 'checkAlreadyRegistered()' gibt zurück, bevor das Ergebnis verfügbar ist. Finden Sie diese Antwort für eine detaillierte Erklärung: http://StackOverflow.com/a/41409942/4815718 –

+0

Also, saveInDatabase() von OnDataChange() aufrufen wird das Problem lösen, oder? – string24

Antwort

0

Alle Daten in Firebase Lesen geschieht asynchron, so empfehle ich Ihnen, Ihren Code, um etwas zu ändern, die wie folgt aussieht:

private void checkAlreadyRegistered(){ 

    /*Get the reference*/ 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users/" + childDetails.getPhone() + "/" + childDetails.getPatientName()); 
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d(TAG, "onDataChange: " + dataSnapshot); 
      if (dataSnapshot.getValue() != null) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
       builder.setTitle("Record Already Exists"); 
       builder.setMessage("The current patient is already registered"); 
       builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         resetRegisterFields(); 
        } 
       }); 
       builder.create(); 
       builder.show(); 
      } 
      else 
      { 
       saveInDatabase(patient_id); //TODO change this accordingly 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

      Toast.makeText(getContext(), "Some error occured", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

Und Ihre Speichermethode:

void saveInDatabase(Long patient_id) { 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Current_registered_users"); 
    mDatabaseReference.setValue(patient_id + 1); 
    childDetails.setPatient_id(patient_id); 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users"); 
    Log.d(TAG, "saveInDatabase: "+mDatabaseReference); 
    mDatabaseReference.child(childDetails.getPhone()).child(childDetails.getPatientName()).child("Registration Details").setValue(childDetails); 
    Button bt = (Button) getView().findViewById(R.id.buttonRegister); 
    resetRegisterFields(); 
    progressDialog.dismiss(); 
    displayPid(patient_id); 
    bt.setEnabled(true); 
    . 
    . 
} 
0

Sie müssen warten die Antwort von Firebase. Sie können einen Rückruf hinzufügen, um den Rest Ihres Codes auszuführen, sobald er abgerufen wurde. Tun Sie etwas wie folgt aus:

eine Schnittstelle ServerCallback genannt anlegen:

public interface ServerCallback 
{ 
    void onSuccess(boolean result); 
} 

In Ihrem checkAlreadyRegistered() Methode, fügen Sie den Rückruf, damit es läuft, wenn die Daten von Firebase abgerufen wird:

private void checkAlreadyRegistered(final ServerCallback callback){ 
    final boolean[] alreadyRegistered = {false}; 
    /*Get the reference*/ 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users/" + childDetails.getPhone() + "/" + childDetails.getPatientName()); 
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d(TAG, "onDataChange: " + dataSnapshot); 
      if (dataSnapshot.getValue() != null) { 
       AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
       builder.setTitle("Record Already Exists"); 
       builder.setMessage("The current patient is already registered"); 
       builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int id) { 

         alreadyRegistered[0] = true; 
         callback.onSuccess(alreadyRegistered[0]); 
        } 
       }); 
       builder.create(); 
       builder.show(); 
      } 
      else 
       callback.onSuccess(alreadyRegistered[0]); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Toast.makeText(getContext(), "Some error occured", Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

dann in Ihr saveInDatabase(), warten Sie auf den Rückruf, dann führen Sie den Rest Ihres Codes:

void saveInDatabase(Long patient_id) { 
    boolean alreadyRegistered = checkAlreadyRegistered(new ServerCallback() { 
     @Override 
     public void onSuccess(boolean result) 
     { 
      if (alreadyRegistered) { 
       resetRegisterFields(); 
       return; 
      } 
      mDatabaseReference = FirebaseDatabase.getInstance().getReference("Current_registered_users"); 
      mDatabaseReference.setValue(patient_id + 1); 
      childDetails.setPatient_id(patient_id); 
      mDatabaseReference = FirebaseDatabase.getInstance().getReference("Users"); 
      Log.d(TAG, "saveInDatabase: "+mDatabaseReference); 
      mDatabaseReference.child(childDetails.getPhone()).child(childDetails.getPatientName()).child("Registration Details").setValue(childDetails); 
      Button bt = (Button) getView().findViewById(R.id.buttonRegister); 
      resetRegisterFields(); 
      progressDialog.dismiss(); 
      displayPid(patient_id); 
      bt.setEnabled(true); 
      . 
      . 
     }); 
} 
Verwandte Themen