Java 如何在Android中存储包含Firestore对象的对象?

Java 如何在Android中存储包含Firestore对象的对象?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在从Android应用程序连接到Cloud Firestore。我需要保存一个对象;该对象包含许多字符串和整数,还包含两个对象 因此,我有以下内容(简化): 包含以下内容的myclourlist对象: String name, description; String[] colours; MyGrid对象包含以下内容: String name, description; int numberOfLinks; MyColourList colourList, colourListDefaul

我正在从Android应用程序连接到Cloud Firestore。我需要保存一个对象;该对象包含许多字符串和整数,还包含两个对象

因此,我有以下内容(简化):

包含以下内容的
myclourlist
对象:

String name, description;
String[] colours;
MyGrid
对象包含以下内容:

String name, description;
int numberOfLinks;
MyColourList colourList, colourListDefault;
我想将一个新的
MyGrid
对象保存到Firestore。Firestore数据结构如下所示:

grids > grid1ID > colourList
                     > name
                     > description
                     > colours
                          > 1
                            > White
                          > 2
                            > Black
                 > colourListDefault
                     > name
                     > description
                     > colours
                          > 1
                            > White
                          > 2
                            > Black
                 > description
                 > name
                 > numberOfLinks
要在不使用
颜色列表的情况下保存此内容,我只需执行以下操作:

Map<String, Object> newGrid = new HashMap<>();
        newGrid.put("name", nameString);
        newGrid.put("description", descriptionString);
        newGrid.put("numberOfLink", num_links);
        databaseRef.collection("grids").add(newGrid);
我收到以下错误和崩溃:
java.lang.IllegalArgumentException:无效数据。不支持的类型:myapp.colorlist(在字段colorlist中找到)


我想在我做这件事之前,我需要以某种方式映射颜色列表,但我找不到任何这样的例子。有人能给我建议吗?

您可以创建一个包含所有变量、数组和其他对象的模型或Pojo。然后使用以下命令将其放入firestore数据库:-

firestore.collection("grids").document(grid1ID).add(your_object).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
    @Override
    public void onSuccess(DocumentReference documentReference) {

    }
    })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            Toast.makeText(Activity_Name.this, "Error In Saving Details: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
     });
firestore.collection(“grids”).document(grid1ID).add(您的_对象).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档引用文档引用){
}
})
.addOnFailureListener(此,新的OnFailureListener(){
@凌驾
公共失效失效失效(例外e){
Toast.makeText(Activity_Name.this,“保存详细信息时出错:”+e.getMessage(),Toast.LENGTH_SHORT.show();
}
});

您可以创建包含所有变量、数组和其他对象的模型或Pojo。然后使用以下命令将其放入firestore数据库:-

firestore.collection("grids").document(grid1ID).add(your_object).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
    @Override
    public void onSuccess(DocumentReference documentReference) {

    }
    })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {
            Toast.makeText(Activity_Name.this, "Error In Saving Details: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
     });
firestore.collection(“grids”).document(grid1ID).add(您的_对象).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档引用文档引用){
}
})
.addOnFailureListener(此,新的OnFailureListener(){
@凌驾
公共失效失效失效(例外e){
Toast.makeText(Activity_Name.this,“保存详细信息时出错:”+e.getMessage(),Toast.LENGTH_SHORT.show();
}
});

使用Cloud Firestore时,您应该使用POJO类或基本类型的映射,但不能将它们混合在一起。在您的特定情况下,由于您已经有了一个
MyGrid
对象,您应该直接将其写入数据库,然后使用以下代码行进行更新:

MyGrid myGrid = // create your MyGrid object
yourReference.set(myGrid);
//Create your MyColourList objects and set the properties
MyColourList myColourList = new MyColourList();
MyColourList colourListDefault = new MyColourList();
myGrid.setColourList(colourList);
myGrid.setColourListDefault(colourListDefault);
yourReference.set(myGrid, SetOptions.merge());

确实,此操作需要两次写入操作(一次用于添加
MyGrid
对象,另一次用于更新它),但这是实现此目的的唯一方法。允许POJO地图的困难在于不清楚如何提取它们。因此,不幸的是,Firestore SDK不支持此功能。只有在使用方法更新整个文档时,才支持该方法。另请参见示例。

使用Cloud Firestore时,应使用POJO类或基本类型的映射,但不要将它们混合在一起。在您的特定情况下,由于您已经有了一个
MyGrid
对象,您应该直接将其写入数据库,然后使用以下代码行进行更新:

MyGrid myGrid = // create your MyGrid object
yourReference.set(myGrid);
//Create your MyColourList objects and set the properties
MyColourList myColourList = new MyColourList();
MyColourList colourListDefault = new MyColourList();
myGrid.setColourList(colourList);
myGrid.setColourListDefault(colourListDefault);
yourReference.set(myGrid, SetOptions.merge());

确实,此操作需要两次写入操作(一次用于添加
MyGrid
对象,另一次用于更新它),但这是实现此目的的唯一方法。允许POJO地图的困难在于不清楚如何提取它们。因此,不幸的是,Firestore SDK不支持此功能。只有在使用方法更新整个文档时,才支持该方法。另请参见示例。

嗨,Shanon!一切都好吗,你试过我上面的解决方案了吗?好的,随时通知我。对不起我的错误。应该是
setcolorlist()
setcolorlistdefault()
,是
colorlist
colorlistdefault
字段的相应设置器。请看我的最新答案。这似乎有效-我已经能够在将myGrid保存到数据库之前设置颜色列表,并一次性将其全部写入。。。我想你说过我不能那样做。。。我是不是做错了什么事,以后会回来咬我?!不,没错。如果你认为我的回答也帮助了你,请考虑接受它。谢谢嗨,沙农!一切都好吗,你试过我上面的解决方案了吗?好的,随时通知我。对不起我的错误。应该是
setcolorlist()
setcolorlistdefault()
,是
colorlist
colorlistdefault
字段的相应设置器。请看我的最新答案。这似乎有效-我已经能够在将myGrid保存到数据库之前设置颜色列表,并一次性将其全部写入。。。我想你说过我不能那样做。。。我是不是做错了什么事,以后会回来咬我?!不,没错。如果你认为我的回答也帮助了你,请考虑接受它。谢谢