我的firebase中有以下数据结构
-ActionSheet
-PendingApproval
-SomeKey1
-someData
-someData
-someData
-SomeKey2
-someData
-someData
-someData
-Approved
-SomeKey3
-someData
-someData
-someData
当屏幕出现时,将显示包含pendingApproval中所有项目的用户。 当用户点击其中一个条目时,我想将数据从“PendingApproval”移动到“Approved”节点。
假设用户点击批准了SomeKey1,目前,我是按照以下方式进行的
1. Duplicate the data to Approved node
2. Upon success, delete the entry SomeKey1 from PendingApproval
但是,第一步成功,第二步失败的可能性很小。在这种情况下,我的数据库中将有两个SomeKey1
我想知道是否有办法自动执行此操作,以确保操作同时成功或失败。
我刚读过Firebase Atmoic,他们只提到原子更新,反对“设置+删除”。
以下是我的代码
// save data to firebase
saveoFirebase_approved(myData: Object, key: string) {
let savePath = '/ActionSheet/Approved/' + key;
return this.af.database.object(savePath).set(myData);
}
// remove pending approval from firebase
removePendingFromFirebase(myData: Object) {
let savePath = '/ActionSheet/PendingApproval/' + key;
return this.af.database.object(savePath).remove();
}
this.databaseService.saveoFirebase_approved(data, key)
.then(result => {
// delete pending from firebase
this.databaseService.removePendingFromFirebase(data)
.then(result => {
// both action completed
})
.catch(error => {
// something went wrong deleting item from firebase
})
})
.catch(error => {
// something went wrong saving to firebase
})
}
注意:我正在使用Angular 2和AngularFire
答案 0 :(得分:4)
您可以通过将null
设置为该位置来删除多位置更新中的数据。所以你的操作就变成了:
var updates = {
'PendingApproval/SomeKey1': null,
'Approved/SomeKey1': {
SomeDate: 'Value'
}
};
ref.child("ActionSheet").update(updates);
您甚至可以在安全规则中验证数据只有在以前处于待处理状态且现在不再处于待处理状态时才能写入Approved
:
"Approved": {
"$key": {
".write": "data.parent().parent().child('PendingApprocal').child($key).exists()
&& !newData.parent().parent().child('PendingApprocal').child($key).exists()"
答案 1 :(得分:1)