我为(想象中的)按摩中心制作应用程序。在活动中,用户可以单击按钮进行预订。只有一个客户必须能够为特定日期和时间进行预订,因此我必须使用一个事务,该事务会考虑数据库的当前状态来处理更新。
现在,我正在做以下事情:
public void processViewResult(Object object, String tag) {
if (tag.equals("reservation")) {
final Reservation reservation = (Reservation) object;
database.getReference().runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
MutableData freeSlots = mutableData.child("slots").child(reservation.getDate());
MutableData userReservations = mutableData.child("users")
.child(reservation.getUserId()).child("reservations");
Boolean isSlotAvailable = freeSlots.hasChild(reservation.getHour());
if (isSlotAvailable) {
mutableData.child(reservation.getHour()).setValue(null);
userReservations.child(String.valueOf(reservation.hashCode())).setValue(reservation);
return Transaction.success(mutableData);
} else {
return Transaction.abort();
}
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
if (databaseError != null) {
Log.e(this.getClass().getSimpleName(), databaseError.toString());
} else {
Log.e(this.getClass().getSimpleName(), "Updated successfully");
}
}
});
}
}
这种方法存在一些问题:
1)由于我需要更新可用的时间段和为当前客户进行的预订,因此我需要获取整个数据库的快照。如果应用程序扩展,这将是非常低效的。
2)这种方法有很多样板。
请告诉我是否有更简单,更优雅的解决方案?