Java, получить ключи от карты, которая имеет данные из FireStore - PullRequest
0 голосов
/ 16 марта 2019

Я получаю данные из FireStore на карту, мои данные в Firestore выглядят так:

(Auto-Document ID)
    title="title1"
    body="body1"
(Auto-Document ID)
    title="title2"
    body="body2"

Когда я загружаю их в карту, они будут выглядеть так:

loadNoteCallBack: {rsmw3EkfIjUQxrzRiyy7 = {body = body2, title = title2}, sTEfYCcPK9lw77xWS8H5 = {body = body1, title = title1}}

* wyx iyiy S 3 3 3 3 33Автоматически сгенерированные идентификаторы документов

Теперь моя проблема в том, что я хочу извлечь из них заголовки , и я точно не знаю, как.
Я пробовал это:

List<String> keys = new ArrayList<>();

for (String key : data.keySet()) {
    keys.add(key);
}

Но я получил идентификаторы документов таким образом.

заголовков: [rsmw3EkfIjUQxrzRiyy7, sTEfYCcPK9lw77xWS8H5]

Как получить заголовки?

update

Я думаю, что сделал это.Это хорошее решение для этой проблемы?

    public static void loadNote() {
    db.collection("Datas")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        Map<String, Object> data = new HashMap<>();
                        List<String> titles = new ArrayList<>();
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            titles.add(document.getString("title"));
                            data.put(document.getId(),document.getData());
                        }                            
                        defaultEntitys.loadNoteCb(data,titles);
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Более чистый подход с использованием потока Java8 будет:

Map<String,FireStore> map=new HashMap<>();

FireStore f1=new FireStore("title1","body1");
FireStore f2=new FireStore("title2","body2");

map.put("rsmw3EkfIjUQxrzRiyy7",f1);
map.put("sTEfYCcPK9lw77xWS8H5",f2);

List<String> titles = map.entrySet()
        .stream()
        .map(e -> e.getValue())
        .map(FireStore::getTitle)
        .collect(Collectors.toList());

System.out.println(titles);

Ваш объект FireStore:

public class FireStore {
    private String body;
    private String title;
    public FireStore(String title,String body) {
        this.body = body;
        this.title = title;
    }
    public String getBody() { return body; }
    public void setBody(String body) { this.body = body; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
}

Как информация, предоставленная вами по ссылке .Вам необходимо добавить следующие изменения.

//asynchronously retrieve all documents
ApiFuture<QuerySnapshot> future = db.collection("cities").get();
// future.get() blocks on response
List<QueryDocumentSnapshot> documents = future.get().getDocuments();
List<String> titles=new ArrayList<>();
for (QueryDocumentSnapshot document : documents) {
  titles.add(document.get("title")); //this will get titles and add into titles list.
}
1 голос
/ 16 марта 2019

Обновление

Вариант 1:

если использовать ссылку на запрос Firestore напрямую, используйте методы класса QueryDocumentSnapshot для получения значений из документа Firestore

импорт

import com.google.cloud.firestore.FirestoreOptions;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;

код

  Firestore db = firestoreOptions.getService();
  ApiFuture<QuerySnapshot> query = db.collection("data").get();
  QuerySnapshot querySnapshot = query.get();
  List<QueryDocumentSnapshot> documents = querySnapshot.getDocuments();
  ArrayList<String> titles = new ArrayList<>();
  for (QueryDocumentSnapshot document : documents) {
    System.out.println("auto id: " + document.getId());
    String title = document.getString("title");
    titles.add(title);
  }
  System.out.println("titles = " + titles);

Вариант 2:

используйте data.entrySet() для получения пары ключ-значение, как показано ниже

for (Map.Entry<String, Object> o : data.entrySet()) {
    String key = o.getKey();
    Object value = o.getValue();
}

использовать любую библиотеку JSON, например, Джексона, для синтаксического анализа значения объекта JSON или объекта класса, чтобы получить заголовок.

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