2017-01-23 4 views
0

Firebaseデータベースの使用。 私は、患者の登録情報を格納するデータベースを持っています。 新しい患者を登録している間、私はその人が既に登録されているかどうかを確認しています。ファイヤーベースからの関数addListenerForSingleValueEvent

以下の機能は、その人の登録がすでに行われているかどうかを確認します。 "Users/Phone_no/Patient_name"に移動して確認しています。 DataSnapshotがnullでない場合は、すでに登録されています。 saveInDatabaseから

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]; 
} 

私は詳細を保存しない場合は、PHONE_NO/Patient_nameに基づく登録がすでに行われているかどうか確認してくださいDO-たいこと

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); 
    . 
    . 
} 

上記の関数を呼んでいます。

問題 - 新しい登録がデータベースに追加された後、checkAlreadyRegistered() - > onDataChangeから ".. already already registered"というメッセージが表示されます。

なぜそのメッセージが来て、どのように解決されますか? Firebaseに読ん

+0

'onDataChange()'は非同期で起動します。 'checkAlreadyRegistered()'は、結果が利用可能になる前に返します。詳細な説明については、この回答を参照してください。http://stackoverflow.com/a/41409942/4815718 –

+0

したがって、onDataChange()からsaveInDatabase()を呼び出すと問題は解決します。 – string24

答えて

0

すべてのデータが非同期的に起こるので、私はあなたがこのようなものにコードを変更をお勧めします:

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(); 
     } 
    }); 
} 

をそして、あなたの方法で保存します。

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

あなたは待つ必要はありFirebaseからの応答。コールバックを追加して、コードの取得後に残りのコードを実行することができます。このような何かを実行します。データはFirebaseから取得された後、それを実行して、コールバックを追加し、あなたのcheckAlreadyRegistered()方法で

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

ServerCallbackと呼ばれるインターフェイスを作成

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(); 
     } 
    }); 
} 

その後にsaveInDatabase()、コールバックを待ってから残りのコードを実行してください:

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); 
      . 
      . 
     }); 
} 
関連する問題