java - Firestore - 嵌套集合的自定义对象

标签 java android firebase google-cloud-firestore

这个问题听起来可能很奇怪。我有以下自定义Object我命名为ItemUser :

private UserInfo user_info;
private List<UserAchievement> user_achievements;

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

enter image description here

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

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

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

onCompletedListener内我得到的自定义对象如下:

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

现在,当我尝试获取 user_achievements 的大小时,一个NullPointerException弹出窗口说我无法获取空引用的大小。

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

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

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

那么,有什么建议可以克服这个问题吗?

最佳答案

How could this be possible done without recalling the database to count only the size?

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

如果您想计算集合下的文档数量(可以添加到列表中),请参阅我的回答 post 其中我解释了 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));
        }
    }
});

关于java - Firestore - 嵌套集合的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275546/

相关文章:

java - 使用 Canvas.drawText 从位图上的 TextView 获取错误的 Y 坐标

java - setDisplayHomeAsUpEnabled 关闭 ActionBarDrawerToggle

ios - Firebase 实时数据库查询不起作用

java - 这个双端队列实现有什么问题

java - 在java中解析xml数据

java - 长时间运行的多线程应用程序部署到 tomcat 时比从命令行运行时慢 4 倍

firebase - firestore 的正确集合结构

java - 从字符串中仅提取某些部分(持续时间)

Android 旋转 MapView

firebase - Flutter Firestore甚至在提供orderby函数后仍以错误的顺序获取