firestore的Android存储库模式

firestore的Android存储库模式,android,firebase,concurrency,repository-pattern,google-cloud-firestore,Android,Firebase,Concurrency,Repository Pattern,Google Cloud Firestore,为了更好地分离关注点,我想实现一个处理所有firestore交互的存储库 目前,我的代码如下所示: public Task<User> get(String email) { DocumentReference docRef = usersRef.document(email); /* Convert and return task? */ } public Task<User> get(String email) { DocumentRefer

为了更好地分离关注点,我想实现一个处理所有firestore交互的存储库

目前,我的代码如下所示:

public Task<User> get(String email) {
    DocumentReference docRef = usersRef.document(email);
    /* Convert and return task? */
}
public Task<User> get(String email) {
    DocumentReference docRef = getDocumentReference(email);

    return docRef.get().continueWith(new Continuation<DocumentSnapshot, User>() {
        @Override
        public User then(@NonNull Task<DocumentSnapshot> task) throws Exception {
            return task.getResult().toObject(User.class);
        }
    });
}
用户存储库:

public class UserRepository {

    private static final String TAG = "UserRepository";

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference usersRef = db.collection("users");

    public Task<DocumentSnapshot> get(String email) {
        DocumentReference docRef = usersRef.document(email); // Users are referenced by email
        Log.d(TAG, "Checking DocumentReference exists for: " + email);
        return docRef.get();
    }
}
公共类用户存储库{
私有静态最终字符串TAG=“UserRepository”;
私有FirebaseFirestore db=FirebaseFirestore.getInstance();
私有集合引用usersRef=db.collection(“用户”);
公共任务获取(字符串电子邮件){
DocumentReference docRef=usersRef.document(email);//电子邮件引用用户
Log.d(标记“检查文档参考存在:”+电子邮件);
返回docRef.get();
}
}
主要活动

                final UserRepository userRepository = new UserRepository();

                userRepository.get(currentUser.getEmail()).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @Override
                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                        Log.d(TAG, "DocumentSnapshot got");
                        // Do something with user
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d(TAG, "Could not get DocumentReference", e);
                    }
                });
final UserRepository UserRepository=new UserRepository();
userRepository.get(currentUser.getEmail()).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档快照文档快照){
Log.d(标记“DocumentSnapshot got”);
//对用户做些什么
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.d(标记“无法获取文档引用”,e);
}
});
用户是POJO

我想要实现的是一个存储库,它不是返回任务,而是返回如下任务:

public Task<User> get(String email) {
    DocumentReference docRef = usersRef.document(email);
    /* Convert and return task? */
}
public Task<User> get(String email) {
    DocumentReference docRef = getDocumentReference(email);

    return docRef.get().continueWith(new Continuation<DocumentSnapshot, User>() {
        @Override
        public User then(@NonNull Task<DocumentSnapshot> task) throws Exception {
            return task.getResult().toObject(User.class);
        }
    });
}
公共任务获取(字符串电子邮件){
DocumentReference docRef=用户引用文件(电子邮件);
/*转换并返回任务*/
}
然后可以像往常一样使用它,在MainActivity中附加一个侦听器。恐怕我在并发性方面有点缺乏技巧,但我觉得这应该是不需要同步的。你能给我一个如何实现这一点的提示吗


提前谢谢

实际上,这个解决方案非常简单,使用了一个延拓。我不确定任务链是否是我真正想要的,但它似乎是一个很好的解决方案。get方法现在如下所示:

public Task<User> get(String email) {
    DocumentReference docRef = usersRef.document(email);
    /* Convert and return task? */
}
public Task<User> get(String email) {
    DocumentReference docRef = getDocumentReference(email);

    return docRef.get().continueWith(new Continuation<DocumentSnapshot, User>() {
        @Override
        public User then(@NonNull Task<DocumentSnapshot> task) throws Exception {
            return task.getResult().toObject(User.class);
        }
    });
}
公共任务获取(字符串电子邮件){
DocumentReference docRef=getDocumentReference(电子邮件);
返回docRef.get().continueWith(新的Continuation()){
@凌驾
公共用户(@NonNull Task Task)抛出异常{
返回task.getResult().toObject(User.class);
}
});
}
编辑: 根据请求,我创建了一个包含我的实现的要点:

您是否公开了其余代码?我很想看看您是如何在repository模式下实现Firestore的。@NajmSheikh我编辑了我的答案,其中包含了我的实现要点,这非常有用!非常感谢。