我正在从我的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,但是我找不到任何示例。有人可以建议我吗?
答案 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作为示例。