Firestore добавление хеш-карт в поле карты в Firestore - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь создать карту объектов в моей базе данных firestore, используя пары ключ -> значение.Идея состоит в том, чтобы иметь карту объектов комнаты в моих документах Properties, где гостиная будет ключом, а объект - ценностью.Как на картинке нижеобъекты в камин, так как карта комнат уже есть, как мне добавить в нее пару ключ-значение ??Мне также нужно выполнить поиск в приведенном ниже коде, чтобы я мог получить документ «Свойства» и добавить объекты в поле карты помещения

FirebaseFirestore db = FirebaseFirestore.getInstance();
final CollectionReference propertyRef = db.collection("Properties");

final Room room = new Room(roomName, feet, inches, imageUrl);

propertyRef.whereEqualTo("propertyId", propertyId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
     if (task.isSuccessful()) {
          for (QueryDocumentSnapshot doc : Objects.requireNonNull(task.getResult())) {
              propertyRef.document(doc.getId())
     ----->   .update("rooms", ""+roomName+"", room);

              Log.d(TAG, "Firebase Success= " + imageUrl);
              Toast.makeText(CreatePropertyActivity3.this, "Property Created", Toast.LENGTH_LONG).show();
              exProperties();
              }
              } else {
                  Toast.makeText(CreatePropertyActivity3.this, "Error check log", Toast.LENGTH_LONG).show();
     }
   }
 });

1 Ответ

0 голосов
/ 05 марта 2019

Используйте метод document(String) для db, который согласно документам создаст документ, если он не существует (https://firebase.google.com/docs/firestore/manage-data/add-data)

Map<String, Object> room = new HashMap<>();
room.put("feet", "...");
...

db.collection("rooms").document("the new room id")
        .set(room)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                  ...
            }
        })
        .addOnFalureListener(...)

Это если вы знаете идентификаторы вашегодокументы, или вы хотите установить идентификатор самостоятельно. Если это так, вы можете заменить аргумент, переданный .document(...) перед добавлением нового элемента. В качестве альтернативы, вы можете использовать метод add(), который создаст новый документ с автоматически сгенерированнымID для вас.

В вашем случае кажется, что вы устанавливаете свои собственные значимые идентификаторы (например, гостиная, кухня), и вам следует изменить переменную propertyId перед добавлением карты.избыточный, так как у вас уже есть атрибут (то есть имя), который описывает комнату. Поэтому используйте add() и избегайте запросов на документ, который не существует, чтобы начать с:

final HashMap<String, Object> newRoom = new HashMap<>();
newRoom.put(roomName, room);
...
propertyRef.add(newRoom)
    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
        @Override
        public void onSuccess(DocumentReference documentReference) {
            Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.w(TAG, "Error adding document", e);
        }
    });

Фактически, потому что вы былииспользуя whereEqualTo, вы всегда выбирали ссылку на один и тот же документ и перезаписывали его содержимое. Просто используйте функциональность add() и посмотрите в документах дополнительные примеры. Надеюсь, это поможет!

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