Java Firestore正在更新2个不同的文档
我在我的应用程序中使用Cloud Firestore,有两个集合Java Firestore正在更新2个不同的文档,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我在我的应用程序中使用Cloud Firestore,有两个集合客户和属性。我有一个活动,用户可以更新包含在客户文档名称、地址等中的数据。下面显示的代码运行良好 db.collection("Customers").document(customer.getCustomerId()) .update( "name", c.getName(), "email", c.ge
客户
和属性
。我有一个活动,用户可以更新包含在客户文档名称、地址等中的数据。下面显示的代码运行良好
db.collection("Customers").document(customer.getCustomerId())
.update(
"name", c.getName(),
"email", c.getEmail(),
"phoneNo", c.getPhoneNo(),
"address", c.getAddress(),
"creatorId", c.getCreatorId()
)
.addOnCompleteListener(new OnCompleteListener<Void>() {
db.collection(“客户”).document(customer.getCustomerId())
.更新(
“名称”,c.getName(),
“email”,c.getEmail(),
“phoneNo”,c.getPhoneNo(),
“地址”,c.getAddress(),
“creatorId”,c.getCreatorId()
)
.addOnCompleteListener(新的OnCompleteListener(){
我将客户的文档引用保存在属性文档中,以便我可以引用哪个客户拥有哪个属性。使用此引用,我希望搜索包含该引用的属性,并在名称字段发生更改时更新该字段。我已尝试在onComplete检查a后将代码添加到我的方法中上面的代码,但它不会每次更新名称字段,只会每隔几次尝试
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference propRef = rootRef.collection("Properties");
propRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Map<Object, String> map = new HashMap<>();
map.put("customer", customerName);
propRef.document(document.getId()).set(map, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
FirebaseFirestore rootRef=FirebaseFirestore.getInstance();
CollectionReference propRef=rootRef.collection(“属性”);
propRef.whereEqualTo(“customerId”,customerId).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
for(QueryDocumentSnapshot文档:Objects.requirennull(task.getResult())){
Map Map=newhashmap();
地图放置(“客户”,客户名称);
propRef.document(document.getId()).set(map,SetOptions.merge()).addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
有没有办法实现我的目标?
我确实认为我可以使用批处理,但从我所读到的内容来看,这不允许搜索 @阿列克斯马莫 这是我的客户收藏中的文档 这是“我的属性”集合中的链接文档 客户结构 属性结构
您需要从firestore OnDataChange实现接口,并接收绑定到视图的变量的新值 在这种情况下,当您修改或更新firestore中的值时,更改将触发此接口,您可以分配新的更改
ValueEventListener myListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Get Post object and use the values to update the UI
Customer customer = dataSnapshot.getValue(Customer.class);
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
};
rootRef.addValueEventListener(myListener);
希望它对你有用
根据您的意见,要解决您的问题,请使用以下代码行:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference propertiesRef = rootRef.collection("Properties");
CollectionReference customersRef = rootRef.collection("Customers");
customersRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
String customerName = document.getString("name");
propertiesRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot doc : task.getResult()) {
propertiesRef.document(doc.getId()).update("customer", customerName);
}
}
}
});
}
}
}
});
FirebaseFirestore rootRef=FirebaseFirestore.getInstance();
CollectionReference propertiesRef=rootRef.collection(“属性”);
CollectionReference CustomerRef=rootRef.collection(“客户”);
customerRef.whereEqualTo(“customerId”,customerId).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
字符串customerName=document.getString(“名称”);
propertiesRef.whereEqualTo(“customerId”,customerId).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
属性ref.document(doc.getId()).update(“客户”,customerName);
}
}
}
});
}
}
}
});
请参见,您应该使用不同的
CollectionReference
对象、propertiesRef
和CustomerRef
,您使用的是单个对象。“我可以使用批处理来完成,但从我读到的内容来看,这不允许搜索。”等等什么?批处理写入只是一组写入操作,如果要同时更新多个文档并处理数据一致性,可以运行批处理。我无法确定如何搜索匹配的属性文档并在批处理写入中分配更改请为这两个列添加数据库结构选择并请回复@AlexMamo@AlexMamo我添加了2张客户和链接属性条目的屏幕截图。我在您的属性对象中看不到任何文档引用。您指的是什么引用,DocumentReference
?您能解释一下您首先要执行的查询是什么,以及基于什么的查询吗t什么是secode one?根据您的示例,预期结果是什么?谢谢,如果客户文档被更新,我可以使用onDataChange更新匹配的属性文档?谢谢,这正是我在交换参考调用后所需要的,非常有效谢谢