java - 如何检查firestore中的查询?
问题描述
尝试检查 firestore 中的查询以了解用户是否发送了请求或收到了请求,它可以相应地执行任务并更改按钮的文本。
firebaseFirestore.collection("users").document(userid).collection("request").whereEqualTo("userid",otherUserid).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
List<DocumentSnapshot> document = task.getResult().getDocuments();
if(document.contains("received")){
current_state="req_received";
send.setText("Accept Request");
}else if(document.contains("sent")){
current_state = "req_sent";
send.setText("Cancel Request");
}
}
}
});
以下代码用于发送或取消请求,它工作正常,但是当我返回另一个活动并再次返回时,按钮的文本更改为发送请求,该请求必须保留以取消请求,因为请求已经发送。
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (userid.equals(otherUserid)) {
Toast.makeText(ProfileActivity.this, "Cannot send request to your own", Toast.LENGTH_SHORT).show();
return;
}
//--------Not friends.....
send.setEnabled(false);
if (current_state.equals("not_friends")) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
// String userid = firebaseAuth.getCurrentUser().getUid();
Map<String, String> profile = new HashMap<>();
profile.put("userid", otherUserid);
firebaseFirestore.collection("users").document(userid).collection("request")
.document("sent").set(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
// String userid = firebaseAuth.getCurrentUser().getUid();
Map<String, String> profile = new HashMap<>();
profile.put("userid", userid);
firebaseFirestore.collection("users").document(otherUserid).collection("request")
.document("received").set(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
send.setEnabled(true);
current_state = "req_sent";
send.setText("Cancel Request");
Toast.makeText(ProfileActivity.this, "Success", Toast.LENGTH_SHORT).show();
}
}
});
} else {
Toast.makeText(ProfileActivity.this, "Failed sending request", Toast.LENGTH_SHORT).show();
}
}
});
}
//-------- Cancel request.......
if (current_state.equals("req_sent")) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
Map<String, Object> profile = new HashMap<>();
// String userid = firebaseAuth.getCurrentUser().getUid();
profile.put("userid", FieldValue.delete());
firebaseFirestore.collection("users").document(userid).collection("request")
.document("sent").update(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
// String userid = firebaseAuth.getCurrentUser().getUid();
Map<String, Object> profile = new HashMap<>();
profile.put("userid", FieldValue.delete());
firebaseFirestore.collection("users").document(otherUserid).collection("request")
.document("received").update(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
send.setEnabled(true);
current_state = "not_friends";
send.setText("Send Request");
Toast.makeText(ProfileActivity.this, "Request canceled", Toast.LENGTH_SHORT).show();
}
}
});
} else {
Toast.makeText(ProfileActivity.this, "Failed request canceled", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
}
解决方案
正如您所确认的,如果错误仅存在于比较部分,则如下所示更改查询迭代可能会解决问题。
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if(document.getId().contains("received")){
current_state="req_received";
send.setText("Accept Request");
// do pending stuffs or break the loop here
} else if(document.getId().contains("sent")){
current_state = "req_sent";
send.setText("Cancel Request");
// do pending stuffs or break the loop here
}
}
}
参考:https ://firebase.google.com/docs/firestore/query-data/queries
推荐阅读
- python - 在计算混淆矩阵时获取样本数量不一致的输入变量的错误
- java - 尝试替换带有括号的字符串中的某些内容,java
- javascript - 如何在 html div 中显示多个图像,使用 javascript 的数组和循环
- javascript - Vue 有没有类似于 Svelte 的命运算子的东西?
- angularjs - Se Chartjs 水平
- typescript - TypeScript - 如何使用数据的运行时映射而不是接口?
- html - 使用 flexbox 使子 div 的高度为父级的 100%
- javascript - 推送到对象内的数组引用推送的对象
- c++ - Boost.beast websocket - 如何为 io_context.run() 制作挂起的 async_read() 队列/工作?
- ios - 初始化新实体以提供获取结果的模板