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

时间:2018-07-16 15:36:35

标签: java android firebase google-cloud-firestore

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

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

MyColourList对象,其中包含:

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

要在没有colourLists的情况下保存它,我只需这样做:

Map<String, Object> newGrid = new HashMap<>();
        newGrid.put("name", nameString);
        newGrid.put("description", descriptionString);
        newGrid.put("numberOfLink", num_links);
        databaseRef.collection("grids").add(newGrid);

效果很好。

但是,当我尝试通过以下方式添加colourLists时:

Map<String, Object> newGrid = new HashMap<>();
        newGrid.put("name", nameString);
        newGrid.put("description", descriptionString);
        newGrid.put("numberOfLink", num_links);
        newGrid.put("colourList", colourList);
        newGrid.put("colourListDefault", colourListDefault);
        databaseRef.collection("grids").add(newGrid);

我遇到以下错误和崩溃:java.lang.IllegalArgumentException: Invalid data. Unsupported type: myapp.ColourList(found in field colourList)

我认为在执行此操作之前,我需要以某种方式映射colourList,但是我找不到任何示例。有人可以建议我吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个包含所有变量,数组和其他对象的模型或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();
        }
     });

答案 1 :(得分:1)

使用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不支持此功能。仅当您使用set()方法更新整个文档时才支持。另请参见official documentation作为示例。