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

标签 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:无效数据。不支持的类型: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/

相关文章:

java - Android :java. sql.SQLException:结果集中没有当前行

firebase - 无法安装 Firebase 消息包

java - Java 属性、类变量或类字段等中的术语是否正确?非常感谢

java - 通过指针检测对象删除

android - 当 View 在 FlatList 中时, View borderRadius 样式不适用于 Android

android - 动画背景,如 Timely 闹钟应用程序

javascript - Firebase 获取特定键的所有值

ios - 我如何像在 Instagram 中一样向它添加评论并允许其他用户也对图片发表评论

java - 如何在形状(椭圆)之外填充颜色

java - 在 Java 6 上从 keystore 中提取证书