请帮我一点问题,我确定你可以做到:D
我正在尝试在Firestore文档“ user_cases_information”上使用字段“ case_number”设置一个字段
>首先,我声明这个全局变量
私有字符串case_number_consecutive = new String(“”);
>在.setonClickListener中,我有以下内容:(从其他文档中读取旧的连续编号或案例编号)
if (service_type.equals("support")){
DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
String consecutive = document.get("consecutive").toString();
if (consecutive.equals(null)) {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
} else {
case_number_consecutive = consecutive; UpdateCaseNumbersConsecutive("support");
}
} else {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
}
}
});
}
Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);
... (then i use a firestore reference to put the new case number)
它假定当我检查Firestore时,恰好是我设置“ user_cases_information”文档的文档时,我应该看到数字或新的case_number,但是我总是得到空引用,连续的字段始终为null
为什么我得到这个空值?我用烤面包,然后放在它之前:
Toast.makeText(...."Value: "+case_number_consecutive
Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);
我怎样才能解决这个问题???非常感谢.
解决方法:
这样做的原因是因为firebase正在异步执行,并且您正在编码,就像一切都同步发生一样.这是什么意思 ?这意味着firebase调用不会立即从服务器返回一个值,需要花费一些时间来获取该值,但是其余代码在响应返回之前正在执行,因此这就是问题所在.因此,即使执行以下代码:
if (service_type.equals("support")){
DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
String consecutive = document.get("consecutive").toString();
if (consecutive.equals(null)) {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
} else {
case_number_consecutive = consecutive; UpdateCaseNumbersConsecutive("support");
}
} else {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
}
}
});
}
等到响应返回时,您的其他代码:
Map<String, Object> user_cases_information = new HashMap<>();
user_cases_information.put("case_number", case_number_consecutive);
已经完成并被调用,那么您将永远无法从firebase获得实际值.
在这里看看我的答案:How to add results of Facebook Graph api to array list in Java如果需要帮助,我会帮你做类似的事情
您可以执行以下操作:
interface Callback{
void firebaseResponseCallback(String result);//whatever your return type is.
}
更改此方法的签名,如下所示:
public void getCaseNumber(Callback callback) {
将您的代码更改为此:
if (service_type.equals("support")){
DocumentReference docRef = firestore_popup.collection("param_data_app").document("support_case_numbers");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
String consecutive = document.get("consecutive").toString();
if (consecutive.equals(null)) {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
} else {
case_number_consecutive = consecutive; UpdateCaseNumbersConsecutive("support");
}
} else {
int random = new Random().nextInt(117) + 4;
case_number_consecutive = "IOC-09"+random;
}
callback.firebaseResponseCallback(case_number_consecutive);
}
});
}
然后,当您调用getCaseNumber时:
getCaseNumber(new Callback() {
@Override
public void firebaseResponseCallback(String result) {
here, this result parameter that comes through is your api call result to use, so result will be your case number, so make your objects inside this method, not outside
}
});
}
编辑
我专门针对这些类型的问题发布了这篇文章:
How to get data from any asynchronous operation in android