我正在从 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:无效数据。不支持的类型:myapp.ColourList(在字段 colorList 中找到)
我认为在执行此操作之前我需要以某种方式映射颜色列表,但我找不到任何示例。谁能给我建议吗?
最佳答案
使用 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举个例子。
关于java - 如何在 Android 中将包含对象的对象存储到 Firestore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51365483/