Как составить список всех root коллекций и получить все продукты? - PullRequest
1 голос
/ 29 января 2020

У меня есть проект в Firestore:

root
 \_ bags
     \_ id
         \_ name: "Bag1"
     \_ id
         \_ name: "Bag2"
 \_ shoes
     \_ id
         \_ name: "Shoe1"
     \_ id
         \_ name: "Shoe2"

И я хочу получить названия всех коллекций (сумки, обувь, футболки и т. Д. c) и отобразить их в виде списка. При щелчке товара я хочу получить все указанные c продукты. Например, когда кто-то нажимает на сумки, я отображаю все сумки. Когда кто-то нажимает на туфли, я показываю все туфли. Я знаю, как отобразить в списке, но не знаю, как получить имена коллекций в Kotlin / Android / Java? Пожалуйста помоги. Я пытался:

FirebaseFirestore db = FirebaseFirestore.getInstance();
db.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        // bags, shoes, t-shirts etc
    }
});

Но у меня ошибка .

1 Ответ

3 голосов
/ 29 января 2020

Как я уже сказал в комментарии, вы не можете вызвать get() для объекта FirebaseFirestore, потому что в этом классе нет такого метода. Однако CollectionReference , расширяющий класс Query , содержит этот метод.

Согласно вашему комментарию:

объект сумки и объект обуви являются то же самое.

Самое простое решение, о котором я могу подумать, - это создать единую коллекцию с именем products и добавить в нее все продукты. Вот как должна выглядеть ваша схема:

Firestore-root
    |
    --- products (collection)
         |
         --- productId (document)
         |     |
         |     --- name: "Bag1"
         |     |
         |     --- type: "bag"
         |
         --- productId (document)
               |
               --- name: "Shoe1"
               |
               --- type: "shoe"

Если вы хотите получить все продукты, просто воспользуйтесь следующей ссылкой и добавьте прикрепленный слушатель:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");
productsRef.get().addOnCompleteListener(/* ... */);

Сейчас Вы можете позвонить get() на этот productsRef объект.

Если вам нужны, например, только сумки, то вам следует использовать следующий запрос:

Query query = productsRef.whereEqualTo("type", "bag");
query.get().addOnCompleteListener(/* ... */);

Все вы Нужно просто добавить новое свойство в каждый документ продукта. Вот и все.

Редактировать:

Чтобы составить список типов продуктов, просто создайте документ со свойством массива типов и добавьте все типы продуктов.

Firestore-root
   |
   --- data (collection)
        |
        --- types (document)
             |
             --- productTypes: ["bags", "shoes", "t-shirts"]

Получить значения этого массива и добавить их в список. Теперь, когда кто-то нажимает на тип, создайте запрос следующим образом:

String selectedType = type.substring(0, s.length() - 1)
Query query = productsRef.whereEqualTo("type", selectedType);

Я использовал type.substring(0, s.length() - 1), чтобы вырезать s в конце слова.

Edit2:

Честно говоря, я не вижу причин, по которым вам не следует использовать вышеупомянутое решение , но проверьте ниже другой подход.

Firestore-root
   |
   --- root (collection)
        |
        --- bags (document)
        |    |
        |    --- products (collection)
        |          |
        |          --- bagIdOne
        |                |
        |                --- name: "Bag1"
        |
        --- shoes (document)
             |
             --- products (collection)
                   |
                   --- shoeIdOne
                         |
                         --- name: "Shoe1"

В этом случае вы не можете использовать простой запрос, вам нужно использовать запрос группы сбора .

db.collectionGroup("products")
    .whereEqualTo("type", selectedType)
    .get()
    .addOnCompleteListener(/* ... */);

. Для отображения типов продуктов используйте следующий код:

productsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d(TAG, document.getId());
            }
        }
    }
});

Результат в вашем логате будет:

bags
shoes
t-shirts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...