java - 如何返回 DocumentSnapShot 作为方法的结果?

标签 java android firebase google-cloud-firestore

采用 (DocumentSnapShot DocumentsnapShot) 参数的自定义对象。也是来自 Firebase 的内部对象,它检索快照并将值设置为我的自定义模型也有其参数(DocumentSnapShot 文档napShot)。但是,我希望从 Firebase 获取数据并将其传递给我的自定义参数,因为我的数据不仅需要 Firebase,还需要多个数据。并且无法在没有覆盖的情况下迭代 Firestore。

代码如下:

public UserSettings getUserSettings(DocumentSnapshot documentSnapshot){
    Log.d(TAG, "getUserSettings: retrieving user account settings from firestore");

    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            settings.setDisplay_name(documentSnapshot.getString("display_name"));
            settings.setUsername(documentSnapshot.getString("username"));
            settings.setWebsite(documentSnapshot.getString("website"));
            settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
            settings.setPosts(documentSnapshot.getLong("posts"));
            settings.setFollowers(documentSnapshot.getLong("followers"));
            settings.setFollowing(documentSnapshot.getLong("following"));
        }
    });
}

最佳答案

您现在无法返回尚未加载的内容。 Firestore 异步加载数据,因为这可能需要一些时间。根据您的连接速度和状态,可能需要几百毫秒到几秒的时间才能获得数据。如果要将 settings 对象传递给另一个方法,只需在 onSuccess() 方法中调用该方法并将该对象作为参数传递即可。因此,快速修复方法如下:

@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
    UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
    yourMethod(settings);
}

One more thing to mention is that you don't need to set the those values to object that already have them. You are already getting the data from the database as an object.

所以请记住,onSuccess() 方法具有异步行为,这意味着甚至在您从数据库获取数据之前就会调用该方法。如果您想在该方法之外使用 settings 对象,则需要创建自己的callback。要实现这一点,首先您需要创建一个如下所示的界面:

public interface MyCallback {
    void onCallback(UserAccountSettings settings);
}

然后您需要创建一个实际从数据库获取数据的方法。该方法应如下所示:

public void readData(MyCallback myCallback) {
    DocumentReference mSettings = mFirebaseFirestore.collection("user_account_settings").document(userID);
    mSettings.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            UserAccountSettings settings = documentSnapshot.toObject(UserAccountSettings.class);
            myCallback.onCallback(settings);

        }
    });
}

最后只需调用 readData() 方法,并在需要的地方将 MyCallback 接口(interface)的实例作为参数传递,如下所示:

readData(new MyCallback() {
    @Override
    public void onCallback(UserAccountSettings settings) {
        Log.d("TAG", settings.getDisplay_name());
    }
});

这是您可以在 onSuccess() 方法之外使用 UserAccountSettings 类的对象的唯一方法。欲了解更多信息,您还可以看看这个 video

关于java - 如何返回 DocumentSnapShot 作为方法的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046101/

相关文章:

java - 应用程序状态 : Static variables or Setters and Getters in JAVA

java - 在保留 Java 中的当前元素的同时调整数组的大小?

java - JComboBox 子菜单项

java - 如何使用YouTube API v3(Java)删除订阅?

java - Android 自定义按钮监听器没有被调用

angularjs - 如何运行 Firebase 和 Angularjs Promises,例如 $loaded(),然后从依赖函数获取值

ios - Swift Firestore 更新字段值

android - 从 FragmentTabHost 获取对嵌套 fragment 的引用

android - Firebase 大查询 - 如何从自定义事件表中检索数据

swift - 如何在等待完成时取消 Firebase setValue(离线时)