如何从Firestore获取数组?

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

我很难获取数据并存储为数组。我只是能够得到一个奇怪的字符串,但任何方法存储为字符串数组?以下是我使用的代码。

我能够在 Swift 中实现如下目标,但不知道如何在 Android 中执行相同的操作。

enter image description here

迅速:

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 Android:

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, 紧急, 任务挑战, 降序, 协作, 每日, 技术, 正常]}


答案 1

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

DocumentSnapshot document = task.getResult();
List<String> group = (List<String>) document.get("dungeon_group");
  • 编辑:类型转换中的语法错误

答案 2

对于您的问题,有两种解决方案,第一种是,您可以通过下一种方式从文档中投射值:

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);

希望它能帮助你!祝您编码愉快!


推荐