如何从 Firestore 获取数组?

新手上路,请多包涵

我将下图所示的数据结构存储在 Cloud Firestore 中。我想保存 dungeon_group 这是存储在 Firestore 中的字符串数组。

我很难获取数据并将其存储为数组。我只能得到一个奇怪的字符串,但是有什么方法可以存储为字符串数组吗?下面是我使用的代码。

我能够在 Swift 中实现这一点,但不确定如何在 Android 中实现同样的目标。

在此处输入图像描述

迅速:

 Firestore.firestore().collection("dungeon").document("room_en").getDocument {
    (document, error) in
    if let document = document {
        let group_array = document["dungeon_group"] as? Array ?? [""]
        print(group_array)
    }
}

Java 安卓:

 FirebaseFirestore.getInstance().collection("dungeon")
                 .document("room_en").get()
                 .addOnCompleteListener(new
                     OnCompleteListener<DocumentSnapshot>() {
                     @Override
                     public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                         DocumentSnapshot document = task.getResult();
                         String group_string= document.getData().toString();
                         String[] group_array = ????
                         Log.d("myTag", group_string);
                     }
                 });

控制台输出如下:

{dungeon_group=[3P, 紧急, 任务挑战, 降临, 协作, 每日, 技术, 普通]}

原文由 Simon Ho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 640
2 个回答

当您调用 DocumentSnapshot.getData() 时,它会返回一个地图。您只是在该地图上调用 toString(),这将为您提供文档中所有数据的转储,这并不是特别有用。您需要按名称访问 dungeon_group 字段:

 DocumentSnapshot document = task.getResult();
List<String> group = (List<String>) document.get("dungeon_group");

  • 编辑:类型转换中的语法错误

原文由 Doug Stevenson 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的问题有两种解决方案,一种是,您可以通过以下方式从文档中转换值:

 DocumentSnapshot document = task.getResult();
List<String> dungeonGroup = (List<String>) document.get("dungeon_group");

或者,我会向您推荐此解决方案,因为 在您开发应用程序时,您的模型总是有可能发生变化。该解决方案只是对 Firebase POJO 中的所有内容进行建模,即使它们只有一个参数:

 public class Dungeon {

    @PropertyName("dungeon_group")
    private List<String> dungeonGroup;

    public Dungeon() {
        // Must have a public no-argument constructor
    }

    // Initialize all fields of a dungeon
    public Dungeon(List<String> dungeonGroup) {
        this.dungeonGroup = dungeonGroup;
    }

    @PropertyName("dungeon_group")
    public List<String> getDungeonGroup() {
        return dungeonGroup;
    }

    @PropertyName("dungeon_group")
    public void setDungeonGroup(List<String> dungeonGroup) {
        this.dungeonGroup = dungeonGroup;
    }
}

请记住,您可以使用注释 @PropertyName 来避免以与数据库中的值相同的方式调用您的变量。以这种方式最终你可以这样做:

 DocumentSnapshot document = task.getResult();
Dungeon dungeon= toObject(Dungeon.class);

希望对您有所帮助!编码愉快!

原文由 Francisco Durdin Garcia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题