Saltar al contenido

como conseguir un array de Firestore?

Intenta entender el código correctamente antes de adaptarlo a tu proyecto si tdeseas aportar algo puedes dejarlo en los comentarios.

Solución:

Cuando llama a DocumentSnapshot.getData(), devuelve un mapa. Simplemente está llamando a String() en ese mapa, lo que le dará un volcado de todos los datos en el documento, y eso no es particularmente útil. Necesitas acceder a la dungeon_group campo por nombre:

DocumentSnapshot document = task.getResult();
List group = (List) document.get("dungeon_group");
  • editar: error de sintaxis en el encasillamiento

Si desea obtener la totalidad dungeon_group array necesitas iterar sobre un Map Me gusta esto:

Map map = documentSnapshot.getData();
for (Map.Entry entry : map.entrySet()) 
    if (entry.getKey().equals("dungeon_group")) 
        Log.d("TAG", entry.getValue().toString());
    

Pero tenga en cuenta que incluso si el dungeon_group El objeto se almacena en la base de datos como un array, entry.getValue() devuelve un ArrayList y no un array.

Un mejor enfoque para usted sería si considera esta estructura de base de datos alternativa, en la que cada group es el key en un Map y todos los valores se establecen en el valor booleano true:

dungeon_group: 
    3P: true,
    Urgent: true,
    Mission Chalange: true
    //and so on

Con esta estructura, también podrá consultarla en función de la propiedad que existe dentro de la dungeon_group mapa, de lo contrario como en la documentación oficial:

Aunque Cloud Firestore puede almacenar arreglos, it does not support consultando array miembros o actualización individual array elementos.

Edición del 13 de enero de 2021:

Si en lugar de un array de valores de cadena habría tenido un array de objetos, entonces puedes mapear eso array de objetos a una Lista de objetos personalizados, como se explica en el siguiente artículo:

  • Cómo mapear un array de objetos de Cloud Firestore a una lista de objetos?

Edición del 13 de agosto de 2018:

Según la documentación actualizada sobre array membresía, ahora es posible filtrar datos basados ​​en array valores usando whereArrayContains() método. Un ejemplo sencillo sería:

CollectionReference citiesRef = db.collection("cities");
citiesRef.whereArrayContains("regions", "west_coast");

Esta consulta devuelve cada documento de ciudad donde el campo de regiones es un array que contiene costa_oeste. Si el array tiene varias instancias del valor que consulta, el documento se incluye en los resultados solo una vez.

Hay dos soluciones para su problema, una, puede convertir el valor de su documento de la siguiente manera:

DocumentSnapshot document = task.getResult();
List dungeonGroup = (List

O, y te recomendaría esta solución porque siempre existe la posibilidad de que su modelo cambie cuando esté desarrollando su aplicación . Esta solución es simplemente modelar todo en Firebase POJO, incluso si solo tienen un parámetro:

public class Dungeon 

    @PropertyName("dungeon_group")
    private List dungeonGroup;

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

    // Initialize all fields of a dungeon
    public Dungeon(List dungeonGroup) 
        this.dungeonGroup = dungeonGroup;
    

    @PropertyName("dungeon_group")
    public List getDungeonGroup() 
        return dungeonGroup;
    

    @PropertyName("dungeon_group")
    public void setDungeonGroup(List dungeonGroup) 
        this.dungeonGroup = dungeonGroup;
    

Recuerda que puedes usar la Anotación @PropertyName para evitar llamar a tus variables de la misma manera que tu valor en la base de datos. Haciéndolo de esta manera, finalmente puedes hacer:

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

¡Espero que te ayude! ¡Feliz codificación!

Al final de la artículo puedes encontrar las explicaciones de otros programadores, tú igualmente tienes la libertad de dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *