Firebase事务,同时更改两个或多个子节点值

时间:2018-06-04 12:47:36

标签: android firebase firebase-realtime-database transactions

所以我有一个简单的预订系统,我允许用户使用Firebase预订门票。我正在使用事务来避免并发问题。

基本上这是DB的结构:

TerminalID:
    BussID:
       SeatID:
           TempEmail:

所以这是我想要预订1号巴士座位的例子.aarList是用户想要预订的座位ID的座位列表。为了预订,我向seatID添加了一封临时电子邮件。

DatabaseReference postRef = mDatabase.child("terminal").child("1");
postRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        if(mutableData.getValue() == null){
            return Transaction.success(mutableData);
        }
        for (int i = 0; i < seatList.size(); i++) {
            if (mutableData.child(Integer.toString(seatList.get(i))).child("tempEmail").getValue() == null) {
                mutableData.child(Integer.toString(seatList.get(i))).child("tempEmail").setValue(mUser.getEmail());
            }
            else{
                Transaction.abort();
            }
        }

        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
        progressBar.setVisibility(View.INVISIBLE);

        // Transaction completed
        if (b == true){                                                         
            Toast.makeText(getContext(), "Success!",
            Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(getContext(), "Someone just reserved them!", Toast.LENGTH_SHORT).show();
        }
    }
});

规则:

"terminal": {
  ".read": true,
  //".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
  "$bid": {
    "$sid": {
      "uid": {
        ".write": "data.val() === 'null' || data.val() === auth.id"
      },
      "tempEmail": {
        ".write": "auth != null"
      },
      "booked": {
        ".write": false
      },
      "email": {
        ".write": false
      }
    }
  }
},

但是,我收到了一个权限被拒绝的错误。我已经仔细检查了规则,并且我允许任何人写作以确保它不是规则。我怀疑这是因为我试图更新超过1个子节点?但是我也试图只预订1个座位,但仍然会出现此错误。所以我想这可能是因为我正在尝试设置子节点的值,这可能是不允许的。或者我的代码可能有些问题?

编辑:我犯了一个错误,当我将write = true设置为JsonObject的顶部时,它确实有效。

0 个答案:

没有答案
相关问题