我有一个 Android Studio 项目,有 2 个用户集合:培训师和学员。我想创建一个方法,接收用户的字符串电子邮件作为输入(用户的电子邮件是两个集合中的文档 ID,用户可以在受训者集合中,也可以在培训师集合中,但不能同时在两者中),并且该方法返回一个布尔值如果用户是培训师,则包含 true;如果不是(意味着他是实习生),则包含 false。
这是我想出的代码,但它不起作用,即使用户是培训师,它也始终返回 false。难道我做错了什么?有一个更好的方法吗?
public static boolean isTrainer(String email)
{
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
DocumentReference trainerRef = firestore.collection("trainers").document(email);
DocumentReference traineeRef = firestore.collection("trainees").document(email);
// Check if the trainer document exists
Task<DocumentSnapshot> trainerTask = trainerRef.get();
boolean isTrainer = trainerTask.isSuccessful() && trainerTask.getResult().exists();
// Check if the trainee document exists
Task<DocumentSnapshot> traineeTask = traineeRef.get();
boolean isTrainee = traineeTask.isSuccessful() && traineeTask.getResult().exists();
// If the trainer document exists but the trainee document doesn't, the user is a trainer
Log.d("FirestoreExample", "isTrainer: " + isTrainer + ", isTrainee: " + isTrainee);
return isTrainer && !isTrainee;
}
我尝试了很多方法但没有任何效果
如果您事先不知道用户是培训师还是实习生,那么您必须明确检查。正如我在您的代码中看到的,您有两个不同的集合,trainers
and trainees
。对于您的情况来说,这没有多大帮助,因为您必须执行两项不同的检查。
因此,对于您的情况,我会推荐一个具有单个集合的模式,如下所示:
db
|
--- users (collection)
|
--- $email (document)
|
--- type: "trainee"
|
--- //other user fields
要检查用户是培训师还是实习生,您只需创建一个指向用户文档的引用,阅读该文档,然后检查用户的类型,如下所示:
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference usersRef = db.collection("users");
DocumentReference emailRef = usersRef.document(email);
emailRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
String type = document.getString("type");
if(type.equals("trainer")) {
//Do something.
} else {
//Do something else.
}
}
} else {
Log.d(TAG, task.getException().getMessage()); //Never ignore potential errors!
}
}
});
你打电话时文档参考#get(),返回的对象类型是Task<DocumentSnapshot>
。因此,为了获得结果,您必须附加一个侦听器,这是一个异步操作,您无法使该操作同步。这意味着您不能将异步操作的结果作为该方法的结果返回。有关更多信息,我建议您阅读我在以下帖子中的回答:
- 如何返回 DocumentSnapShot 作为方法的结果?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)