Firestore将哈希图添加到Firestore中的地图字段

时间:2019-03-04 23:24:06

标签: android google-cloud-firestore

我正在尝试使用键->值对在Firestore数据库中创建对象映射。 这个想法是在我的“属性”文档中创建一个房间对象的地图,其中客厅是关键,而对象则是有价值的。就像下面的图片

rooms map

rooms map

我迷失了将对象添加到Firestore中的正确方法,因为房间地图已经存在,所以如何在其中添加键值对? 我还需要执行下面的代码中的搜索,以便可以获取“属性”文档并将对象添加到“房间地图”字段中

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 :(得分:1)

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(...)

这是如果您知道文档的ID,或者想要自己设置ID。如果是这样,您可以在添加新项目之前替换传递给.document(...)的参数。另外,您可以使用add()方法来为您创建一个具有自动生成的ID的新文档。

在您的情况下,好像您要设置自己的有意义的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()功能并查看文档以获取更多示例。希望有帮助!