Android Firebase事务,同时更改两个或多个子节点值
因此,我有一个简单的预订系统,允许用户使用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
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
}
}
}
},