Android 无法为以下firestore集合创建数据类

Android 无法为以下firestore集合创建数据类,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我的收藏 我的数据类 data class Data( val Name: String, val Numbers: List<String>, val Doctors: Map<String, Map<String, List<String>>> ) 数据类数据( val Name:String, val编号:列表, 瓦尔医生:地图 ) 但这不起作用,因为我无法反序列化返回的快照 我认为问题在于医生节点,它包含一个带有

我的收藏

我的数据类

data class Data(
    val Name: String,
    val Numbers: List<String>,
    val Doctors: Map<String, Map<String, List<String>>>
)
数据类数据(
val Name:String,
val编号:列表,
瓦尔医生:地图
)
但这不起作用,因为我无法反序列化返回的快照

我认为问题在于医生节点,它包含一个带有字符串键
1
2
的映射,它们也是映射并包含 将名称存储为字符串的
名称
和将数字存储为数组列表的
数字

什么是合适的数据类和
我如何质疑医生的专业性??如果在firestore中无法做到这一点,我该怎么做呢?

如果你的应用程序将被广泛使用,那么在一个文档中嵌套大量“医生”可能不是最好的解决方案。在Firestore中存储大量数据的最佳可扩展方式是使用集合中的文档。数组确实是一个数组,但这种类型的字段不适合不断增长的列表。还有一个问题,Firestore中的文档有限制。因此,当涉及到可以将多少数据放入文档时,存在一些限制。根据官方文件,关于:

文档的最大大小:1 MiB(1048576字节)

如您所见,单个文档中的数据总量限制为1 MiB。当我们谈论存储文本时,您可以存储很多内容,但随着数组变大,您可能会超过此限制,这显然会导致大规模问题。这种方法通常也被认为是一种糟糕的设计

因此,数据的可行模式应如下所示:

Firestore-root
   |
   --- doctors
         |
         --- $doctorId
                |
                --- name: "Doctor Name"
                |
                --- phoneNumbers: ["+91...", "+91..."]
                |
                --- specialization: ["cardiology", "dermatology"]
doctorsRef.whereEqualTo("specializationOne", "cardiology").whereEqualTo("dayOne", "Monday").addOnCompleteListener(/* ... /*);
如您所见,“PhoneNumber”和“specialization”属性都是数组。现在,建议将数据存储在阵列中,因为每个阵列都会保存少量数据

最终,我希望尽可能高效地查询专门化数组

要获得所有具有特定专业的医生,例如“心脏病学”,请使用以下代码行:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference doctorsRef = rootRef.collection("doctors");
doctorsRef.whereArrayContains("doctors", "cardiology").addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d("TAG", document.getString("name"));
            }
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

P.S.总是考虑将类中的字段的名称存储到.< /P> 编辑:

是否可以在一个集合中同时查询专业化和天数

如果天数也将是一个数组,您不能,因为还有另一个:

每个查询最多只能使用一个数组contains子句。不能将数组包含与数组包含任何组合

如果你想根据多个值查询,那么你应该考虑根本不使用数组,但是简单的属性:

Firestore-root
   |
   --- doctors
         |
         --- $doctorId
                |
                --- name: "Doctor Name"
                |
                --- phoneNumbers: ["+91...", "+91..."]
                |
                --- specializationOne: "cardiology"
                |
                --- specializationTwo: "dermatology"
                |
                --- dayOne: "Monday"
然后使用如下所示的查询:

Firestore-root
   |
   --- doctors
         |
         --- $doctorId
                |
                --- name: "Doctor Name"
                |
                --- phoneNumbers: ["+91...", "+91..."]
                |
                --- specialization: ["cardiology", "dermatology"]
doctorsRef.whereEqualTo("specializationOne", "cardiology").whereEqualTo("dayOne", "Monday").addOnCompleteListener(/* ... /*);

你有什么办法可以改变文件结构吗?是的,我愿意。最终,我希望尽可能高效地查询专门化数组,因此我决定将所有内容都塞进一个集合中。这可能吗?根据上述要求,你将如何组织你的数据。好的,我会马上给你写一个答案。谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!这里的根集合实际上是一个诊所,它存储诊所的详细信息。底部的
Name
number
字段用于保存诊所名称和联系电话。因此,医生人数最多为2至3名。另外还有另一个名为
days
的数组,我到目前为止还没有添加它,它将以数组形式保存医生可用的天数。是否可以在单个集合中同时查询专业化和天数?或者我必须分解数据。根据专业和日期获取可用的医生,然后获取医生id所在的诊所??顺便说一句,我非常感谢你的详细回答。在我继续之前,我只需要澄清以上几点。如果是这样,请检查我编辑的答案。谢谢@AlexMamo,还有最后一件事?有没有办法根据收集的数据生成kotlin数据类?没有,您需要自己创建这些类。没有用于执行此操作的API。