java - 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_achievements
,NullPointerException
弹出一个提示我无法获取空引用的大小。
因此user_achievements
为空。我认为我user_achievements
在自定义对象中定义的方式是此异常的原因。
问题是:如果不调用数据库来仅计算大小,这怎么可能做到呢?
我有主要的自定义对象ItemUser
,它的子对象是“健康的”,除了user_achievements
它的定义方式 - List<UserAchievement>
。
那么,有什么建议可以解决这个问题吗?
解决方案
如果不调用数据库只计算大小,这怎么可能做到呢?
不,因为 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));
}
}
});
推荐阅读
- swift - 单击时将标签文本复制到剪贴板
- ionic4 - 如何为用户提供设置 baseurl 的选项?
- c# - 将双引号写入csv会导致三个双引号
- git - 如何使用 git log 找到包含凭据/密码的提交
- c# - 是否可以在 .NET Standard 项目的会话中设置和获取值
- delphi - 自定义属性约束
- google-cloud-platform - 是否可以通过主机计算引擎虚拟机的内部或外部 IP 连接到 Cloud SQL 代理?
- testing - TestCafe BeforeEach / Before
- javascript - 为什么这个 React 条件渲染有问题?
- python-3.x - “如何创建一长串字符串”