Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase事务,同时更改两个或多个子节点值_Android_Firebase_Firebase Realtime Database_Transactions - Fatal编程技术网

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

Android Firebase事务,同时更改两个或多个子节点值,android,firebase,firebase-realtime-database,transactions,Android,Firebase,Firebase Realtime Database,Transactions,因此,我有一个简单的预订系统,允许用户使用Firebase预订机票。我使用事务来避免并发问题 基本上,这是数据库的结构: TerminalID: BussID: SeatID: TempEmail: 这是一个例子,我想预订1路公共汽车的座位。seatList是用户想要预订的带有SeatID的座位列表。为了预订,我向seatID添加了一封临时电子邮件 DatabaseReference postRef = mDatabase.child("termin

因此,我有一个简单的预订系统,允许用户使用Firebase预订机票。我使用事务来避免并发问题

基本上,这是数据库的结构:

TerminalID:
    BussID:
       SeatID:
           TempEmail:
这是一个例子,我想预订1路公共汽车的座位。seatList是用户想要预订的带有SeatID的座位列表。为了预订,我向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();
        }
    }
});
但是,我得到一个权限被拒绝的错误。我已经仔细检查了规则,我允许任何人写作只是为了确保这不是规则。我怀疑这是因为我试图更新多个子节点?然而,我也试图只预订一个座位,但这个错误仍然发生。所以我认为这可能是因为我正在尝试设置子节点的值,这可能是不允许的。或者我的代码总体上可能有问题


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

请在你的问题中包括你的规则和实际结构(不是表示法)(作为文本)你是否将规则添加为{“规则”:{.read:true,“.write:true}}}@AndréKool抱歉,现在更新了@安加利:我已经更新了帖子,加入了一些规则,我想这和你的建议很相似。@AndréKool很好,谢谢!
"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
      }
    }
  }
},