这个问题听起来可能很奇怪。我有以下自定义Object
我命名为ItemUser
:
private UserInfo user_info;
private List<UserAchievement> user_achievements;
两个字段都有 getter 和 setter。我的 Firestore 数据库如下所示:
我想要 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/