首页 > 解决方案 > Firestore - 嵌套集合的自定义对象

问题描述

这个问题可能听起来很奇怪。我有以下Object我命名的习惯ItemUser

private UserInfo user_info;
private List<UserAchievement> user_achievements;

这两个字段都有 getter 和 setter。我的 Firestore 的数据库如下所示:

在此处输入图像描述

我想获取List大小而不是重新调用数据库并从单独的调用中获取集合的大小,这会消耗大量资源并花费大量时间(3-4 秒)。

首先,我使用以下方法获取数据:

mDB.collection("COLLECTION_NAME").document("USER_ID").get()

在里面,onCompletedListener我得到了如下的自定义对象:

ItemUser mUser = task.getResult().toObject(ItemUser.class);

现在,当我尝试获取 的大小时user_achievementsNullPointerException弹出一个提示我无法获取空引用的大小。

因此user_achievements为空。我认为我user_achievements在自定义对象中定义的方式是此异常的原因。

问题是:如果不调用数据库来仅计算大小,这怎么可能做到呢?

我有主要的自定义对象ItemUser,它的子对象是“健康的”,除了user_achievements它的定义方式 - List<UserAchievement>

那么,有什么建议可以解决这个问题吗?

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


如果不调用数据库只计算大小,这怎么可能做到呢?

不,因为 Cloud Firestore 是一个实时数据库,并且可以添加或删除项目,因此要获取列表的大小,您需要查询数据库并使用get()调用。

如果您想计算集合下的文档数量(可以添加到列表中),请查看我在这篇文章中的回答,我在其中解释了task.getResult().size()可以帮助您解决问题的方法。

编辑:

mDB.collection("COLLECTION_NAME").document("USER_ID").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            int size = task.getResult().size();
            Log.d(TAG, String.valueOf(size));
        }
    }
});

推荐阅读