gpt4 book ai didi

java - 如何在firebase android中同时向一个节点的两个子节点写入数据?

转载 作者:行者123 更新时间:2023-12-01 17:00:40 32 4
gpt4 key购买 nike

我正在制作一个 Android 应用程序,客户和服务提供商通过该应用程序进行协作。首先,服务提供商向客户发送拜访请求,指定可能的拜访时间。客户接受访问请求后,计时器启动,计算服务提供商访问的剩余时间。如果时间到期,则应将“访问请求”从“已接受/待处理访问列表”中删除并添加到“已完成访问列表”中,并且应自动为两者(即服务提供商和客户)提供“5”评级。我创建了两个函数,一个函数将访问请求从“待处理访问列表”传输到“已完成访问列表”,第二个函数在第一个函数内调用,为两个用户提供“5”评级。问题是,当第二个函数运行时,第一个函数无法完成其功能,因为第二个函数在 fires 函数完成之前运行。我在帖子末尾粘贴了这两个函数及其调用顺序的 Spinet 代码以及更简单的代码版本,以便于理解。

   // this functions Transfers Pending/Accepted Visit Request to Completed Visit Request.

public void transferPendingVisitToCompletedVisitListOfCustomerAndServiceProvider(final VisitRequest
visitRequest, final String customerUserName, final int position, final String
serviceProviderUserName){
final DatabaseReference cus_ref =
FirebaseDatabase.getInstance().getReference("Users").child("Customers");

final Customer customer[] = new Customer[1];

cus_ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ssn:dataSnapshot.getChildren()){
customer[0] = ssn.getValue(Customer.class);
if(customer[0].getUserName().equals(customerUserName)){
alCompletedVisitRequests = customer[0].getCompletedVisitsList();

if(alCompletedVisitRequests==null){
alCompletedVisitRequests = new ArrayList<>();
alCompletedVisitRequests.add(visitRequest);
customer[0].setCompletedVisitsList(alCompletedVisitRequests);
alPendingVisitRequests.remove(position);
customer[0].setPendingVisitsList(alPendingVisitRequests);

// updating the UI
PendingVisitRequestsAdapter pendingVisitRequestsAdapter = new
PendingVisitRequestsAdapter();
listViewPendingVisits.setAdapter(pendingVisitRequestsAdapter);
cus_ref.child(customer[0].getId()).setValue(customer[0]);

// Now Checking if the Visit Request is is expired then rating of 5 should be
// given to both users.
if(isPendingVisitExpired==true){


// now handling the responseTime Rating of Service Provider and Customer
automaticallyAddResponseRatingOfServiceProviderandCustomer
(MainActivity.mcustomer.getUserName(),serviceProviderUserName);
}

}

else{ //i-e alCompletedVisitRequests!=null

alCompletedVisitRequests.add(visitRequest);
customer[0].setCompletedVisitsList(alCompletedVisitRequests);
alPendingVisitRequests.remove(position);
customer[0].setPendingVisitsList(alPendingVisitRequests);

// updating the UI
PendingVisitRequestsAdapter pendingVisitRequestsAdapter = new
PendingVisitRequestsAdapter();
listViewPendingVisits.setAdapter(pendingVisitRequestsAdapter);
cus_ref.child(customer[0].getId()).setValue(customer[0]);

// adding Response Time Rating automatically.Definition of this function is below

automaticallyAddResponseRatingOfServiceProviderandCustomer
(MainActivity.mcustomer.getUserName(),serviceProviderUserName);
}

visitRequest.setUserName(MainActivity.mcustomer.getUserName());


addPendingVisitToCompletedVisitInServiceProvider(visitRequest,serviceProviderUserName);



}
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
}

现在我粘贴响应时间评级函数的定义,该函数已在第一个函数内调用,如上所示。

 private void automaticallyAddResponseRatingOfServiceProviderandCustomer(final String CustomerUserName, final String ServiceProviderUserName){

DatabaseReference databaseReference =
FirebaseDatabase.getInstance().getReference("Users").child("ServiceProviders");
final String[] ServiceProviderId = new String[1];
final String[] ServiceProviderImageUrl = new String[1];
final ServiceProvider[] serviceProvider = new ServiceProvider[1];

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

for(DataSnapshot ssn:dataSnapshot.getChildren()){
serviceProvider[0] = ssn.getValue(ServiceProvider.class);

if(serviceProvider[0].getUserName().equals(ServiceProviderUserName)){

ServiceProviderId[0] = serviceProvider[0].getId();
ServiceProviderImageUrl[0] = serviceProvider[0].getProfilePicUrl();
ResponseTimeRating responseTimeRating = new
ResponseTimeRating(MainActivity.mcustomer.getImageUrl(),
MainActivity.mcustomer.getUserName(),5);

ArrayList<ResponseTimeRating> responseTimeRatingArrayListOfServiceProvider =
serviceProvider[0].getResponseTimeRatingList();

if(responseTimeRatingArrayListOfServiceProvider==null){
responseTimeRatingArrayListOfServiceProvider = new ArrayList<>();
responseTimeRatingArrayListOfServiceProvider.add(responseTimeRating);

serviceProvider[0].setResponseTimeRatingList(responseTimeRatingArrayListOfServiceProvider);
int averageResponseTimeRatingOfServiceProvider = 0;
int sum = 0;
for (int i = 0; i < responseTimeRatingArrayListOfServiceProvider.size(); i++)
{
sum = sum +
responseTimeRatingArrayListOfServiceProvider.get(i).getResponseRating();
}

averageResponseTimeRatingOfServiceProvider = sum /
responseTimeRatingArrayListOfServiceProvider.size();

serviceProvider[0].setResponseRating(averageResponseTimeRatingOfServiceProvider);

automaticallyAddResponseRatingOfCustomer(ServiceProviderImageUrl[0],ServiceProviderUserName);

break;
}
else{
responseTimeRatingArrayListOfServiceProvider.add(responseTimeRating);

serviceProvider[0].setResponseTimeRatingList(responseTimeRatingArrayListOfServiceProvider);
int averageResponseTimeRatingOfServiceProvider = 0;
int sum = 0;
for (int i = 0; i < responseTimeRatingArrayListOfServiceProvider.size(); i++) {
sum = sum +
responseTimeRatingArrayListOfServiceProvider.get(i).getResponseRating();
}
averageResponseTimeRatingOfServiceProvider = sum /
responseTimeRatingArrayListOfServiceProvider.size();

serviceProvider[0].setResponseRating(averageResponseTimeRatingOfServiceProvider);

automaticallyAddResponseRatingOfCustomer(ServiceProviderImageUrl[0],ServiceProviderUserName);
break;
}
}
}
DatabaseReference newDatabaseReference =
FirebaseDatabase.getInstance().getReference("Users").
child("ServiceProviders").child(serviceProvider[0].getId()
);
newDatabaseReference.setValue(serviceProvider[0]);

}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});

现在我为这两个函数代码粘贴了更简单版本的代码,以便于理解。

// definition of first function which transfers Pending Visit  From 'Pending Visits List' to 
// 'Completed Visit List'

transferPendingVisitToCompletedVisitListOfCustomerAndServiceProvider
(visitRequest,MainActivity.mcustomer.getUserName(),position,ServiceProviderUserName){

// logic for transferring 'Visit Request' From 'Pending Visit List' to 'Completed Visit List'

bla bla bla bla
bla bla bla bla

// now calling the function which gives rating to both Users
automaticallyAddResponseRatingOfServiceProviderandCustomer
(MainActivity.mcustomer.getUserName(),serviceProviderUserName);

}// end definition of first function

问题是,当在第一个函数内调用第二个函数时,第一个函数的功能(即,将“访问请求”从“待处理访问列表”转移到“已完成访问列表”)无法完成,这意味着它不会传输“访问请求”但给出评级。

但是,如果我从第一个函数内部删除第二个函数(即评级函数),那么第一个函数的功能将完美运行,并将“访问请求”转移到“已完成的访问” 列表'。如何才能完美地运行这两个函数的功能?

最佳答案

如果您想通过一次操作写入多个位置,则可以使用多位置更新。

假设你有这两个写:

cus_ref.child(customer[0].getId()).setValue(customer[0]);
DatabaseReference newDatabaseReference = FirebaseDatabase.getInstance().getReference("Users").child("ServiceProviders").child(serviceProvider[0].getId());
newDatabaseReference.setValue(serviceProvider[0]);

它们可以组合为:

Map<String,Object> updates = new HashMap<String,Object>();
updates.put("/path/to/cus_ref/"+customer[0].getId(), customer[0]);
updates.put("/Users/ServiceProviders/"+serviceProvider[0].getId(), serviceProvider[0]);

FirebaseDatabase.getInstance().getReference().updateChildValues(updates);

关于java - 如何在firebase android中同时向一个节点的两个子节点写入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61508572/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com