创建一个事务以更新Firebase数据库中的多个位置

时间:2016-06-07 01:49:38

标签: android firebase firebase-realtime-database

我为(想象中的)按摩中心制作应用程序。在活动中,用户可以单击按钮进行预订。只有一个客户必须能够为特定日期和时间进行预订,因此我必须使用一个事务,该事务会考虑数据库的当前状态来处理更新。

现在,我正在做以下事情:

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)这种方法有很多样板。

请告诉我是否有更简单,更优雅的解决方案?

0 个答案:

没有答案