У меня проблема с извлечением данных из базы данных Firebase syn c. Я могу получить данные, но возвращение работает до этого. Поэтому мои данные никогда не помещаются в предполагаемый список.
Вот мой код:
DatabaseManager databaseManager = new DatabaseManager();
MedicineData medicineData = new MedicineData();
boolean validated = false;
private static final String TAG = "BarcodeDecoderDataMatrix";
public Map getDataMatrix(String dataMatrixText) {
Map<String, Object> dataMatrix = new HashMap<>();
String barcodeNum = getBarcodeNumber(dataMatrixText);
String expireDate = getExpireDate(dataMatrixText);
String serialNum = getSerialNumber(dataMatrixText);
String partyNum = getPartyNumber(dataMatrixText);
dataMatrix.put("barcodeNumber",barcodeNum);
dataMatrix.put("expireDate", expireDate);
dataMatrix.put("serialNumber", serialNum);
dataMatrix.put("partyNumber", partyNum);
getMedicineName(barcodeNum, (success) -> {
if(success){
//find the data on database
dataMatrix.put("medicineName", medicineData.getProductName());
dataMatrix.put("companyName", medicineData.getCompanyName());
dataMatrix.put("price", medicineData.getPrice());
}
else {
//can't find on database
}
});
return dataMatrix;
}
Этот метод вызван из другого класса для получения списка dataMatrix.
private void getMedicineName(String barcodeNum, SimpleCallback<Boolean> finishedCallback) {
DatabaseReference rootRef = databaseManager.getReference();
DatabaseReference medicinesRef = rootRef.child("MedicineList");
Query queryMedicineNameFinder = medicinesRef.orderByKey().equalTo(barcodeNum);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
medicineData = ds.getValue(MedicineData.class);
}
if (medicineData != null){
validated = true;
}
finishedCallback.run(validated);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
finishedCallback.run(false);
}
};
queryMedicineNameFinder.addListenerForSingleValueEvent(valueEventListener);
}
Эти два метода находятся в одном классе с именем BarcodeDecoderDataMatrix. Я создаю экземпляр этого класса из другого класса и вызываю метод getDataMatrix. Я ожидаю получить список, включающий мои значения. Я могу получить значения barcodeNum, expireDate, serialNum, partyNum без проблем. Но список не включает в себя MedicineName, companyName и информацию о ценах. Я сделал отладку, чтобы я знал, что могу получить данные из базы данных. Я могу видеть это в переменной MedicineData. Я почти уверен, что это проблема syn c. Потому что мои данные в MedicineData, но они не могут поместить их в список до возврата, вызвали.
Как я могу это сделать?