我在我的应用中使用Cloud Firestore,并且有2个集合Customers
和Properties
。我有一个活动,用户可以更新包含在客户文档名称地址等中的数据。下面显示的代码可以正常工作。
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>() {
我在属性文档中保存了客户的文档引用,因此我可以引用哪个客户拥有哪个属性。使用此引用,我想搜索包含该引用的属性,并在名称字段已更改的情况下更新它。我尝试在onComplete检查上面的代码之后将代码添加到我的方法中,但是它不会每次仅几次尝试就更新名称字段。
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()) {
有没有办法实现我想要做的事情? 我确实认为我可以使用批处理来实现,但是从我阅读的内容来看,这不允许搜索。
@AlexMamo
这是我的“客户”收藏集中的文档
这是我的媒体资源集合中的链接文档
客户结构
财产结构
答案 0 :(得分:1)
根据您的评论,要解决您的问题,请使用以下代码行:
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);
}
}
}
});
}
}
}
});
看到您应该使用不同的CollectionReference
对象propertiesRef
和customersRef
,而您使用的是单个对象。
答案 1 :(得分:0)
您需要从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);
希望它对您有用。
https://firebase.google.com/docs/database/android/read-and-write?authuser=0