我正在尝试使用键->值对在Firestore数据库中创建对象映射。 这个想法是在我的“属性”文档中创建一个房间对象的地图,其中客厅是关键,而对象则是有价值的。就像下面的图片
我迷失了将对象添加到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();
}
}
});
答案 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()
功能并查看文档以获取更多示例。希望有帮助!