为了更好地分离关注点,我想实现一个处理所有firestore交互的存储库。
目前,我的代码如下所示:
UserRepository:
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();
}
}
MainActivity
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);
}
});
用户是POJO
我想要实现的是一个Repository,而不是Task返回Task,就像这样:
public Task<User> get(String email) {
DocumentReference docRef = usersRef.document(email);
/* Convert and return task? */
}
然后可以像往常一样使用,在MainActivity中附加一个监听器。我担心我有点缺乏并发技能,但我觉得这应该是可能的,而不必同步。你能否告诉我如何实现这个目标?
提前致谢!
答案 0 :(得分:3)
实际上解决方案很简单,使用Continuation。我不确定任务链是否是我实际需要的东西,但它似乎是一个很好的解决方案。 get方法现在看起来像这样:
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);
}
});
}
编辑: 每个请求我创建了一个包含我的实现的要点: Firestore Repository Gist