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に読ん
'onDataChange()'は非同期で起動します。 'checkAlreadyRegistered()'は、結果が利用可能になる前に返します。詳細な説明については、この回答を参照してください。http://stackoverflow.com/a/41409942/4815718 –
したがって、onDataChange()からsaveInDatabase()を呼び出すと問題は解決します。 – string24