gpt4 book ai didi

java - 从firebase数据库获取数据时的同步问题

转载 作者:行者123 更新时间:2023-12-01 18:01:16 25 4
gpt4 key购买 nike

我的 Firebase 数据库数据检索同步出现问题。我能够获取数据,但在它之前返回工作。所以我的数据从未放入预期列表中。

这是我的代码:

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 方法。我期待得到一份包含我的值(value)观的 list 。我可以毫无问题地获取barcodeNum、expireDate、serialNum、partyNum 值。但该列表不包括medicineName、companyName 和价格信息。我进行了调试,所以我知道我可以从数据库获取数据。我可以在 MedicineData 变量中看到它。我很确定这是一个同步问题。因为我的数据在medicineData中,但在返回调用之前无法将其放入列表中。

我怎样才能做到这一点?

最佳答案

您在代码中使用的

addListenerForSingleValueEvent() 方法是异步的。这意味着它会立即返回,而 onDataChange() 方法仅在结果可用时才会触发。

您在代码中所做的事情是不正确的,因为您假设结果立即可用,但事实并非如此。

当您调用getMedicineName()方法时,在知道数据可用后,您应该在回调中直接使用dataMatrix

有关更多信息,我建议您查看我的答案的最后部分 post 其中我解释了如何使用自定义回调来完成它。您还可以看看这个video 为了更好地理解。

关于java - 从firebase数据库获取数据时的同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60621824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com