gpt4 book ai didi

Firestore 的 Android 存储库模式

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:22 25 4
gpt4 key购买 nike

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

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

用户资料库:

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();
}
}

主要 Activity

                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 中附加一个监听器。恐怕我在并发方面有点缺乏技巧,但我觉得这应该是可能的,而不必同步。你能给我一个关于如何实现这一目标的提示吗?

提前致谢!

最佳答案

实际上解决方案非常简单,使用 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

关于Firestore 的 Android 存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com