Проблема синхронизации при получении данных из базы данных Firebase - PullRequest
0 голосов
/ 10 марта 2020

У меня проблема с извлечением данных из базы данных 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, но они не могут поместить их в список до возврата, вызвали.

Как я могу это сделать?

1 Ответ

0 голосов
/ 10 марта 2020

addListenerForSingleValueEvent() метод, который вы используете в своем коде, является асинхронным. Это означает, что он возвращается немедленно, в то время как метод onDataChange() запускается только тогда, когда результаты доступны.

То, что вы делаете в своем коде, неверно, так как вы предполагаете, что результаты доступны сразу и не доступны.

Когда вы вызываете метод getMedicineName(), вы должны непосредственно использовать dataMatrix в обратном вызове, после того, как известны данные, которые доступны.

Для получения дополнительной информации, я рекомендую вам увидеть последнюю часть мой ответ от этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...