这是我的firebase db的结构:
/UserData
/DeviceMgmt
/Counters
/NumberOfAll:
/NumberOfSelected
/TotalDownloaded
...
/Devices
/pushId1
/uid
/toSelect=true (optional)
/downloaded
/lastDownload
/pushId2
/pushId2
...
我的代码:
exports.countNumberOfAllDevices = functions.database.ref('/UserData/DeviceMgmt/Devices/{pushId}').onWrite(
(change) => {
const collectionRef = change.after.ref;// /UserData/DeviceMgmt/Devices/{pushId}
const countRef = collectionRef.parent.parent.child('Counters/NumberOfAll');
let increment;
if (change.after.exists() && !change.before.exists()) {
increment = 1;
} else if (!change.after.exists() && change.before.exists()) {
increment = -1;
} else {
return null;
}
return countRef.transaction((current) => {
return (current || 0) + increment;
}).then(() => {
return console.log('counter /UserData/Counters/NumberOfAll updated.');
});
});
基于functions-samples/child-count/推送消息被我的设备替换,但我的设备有子节点,示例中的消息没有子女。
我的问题是:
1。 当我的设备在java中创建时,一个写入是对象创建,另一个是对其子进行更新,因此NumberOfAll计数器增加2。
我应该用
替换countNumberOfAllDevices两个功能:
incrementNumberOfAllDevices
onCreate
(创建设备对象后,之后不再创建子项)
decrementNumberOfAllDevices
的 onDelete
(在删除设备对象之前,之前没有删除子项)
OR
深入了解
的快照参考/Devices/{pushId}
到
/Devices/{pushId}/uid
在创建和删除之间永远不会更改uid?
触发云功能的我的Java代码:
testAddNewDeviceToDevices(String token) {
Device device = new Device( "Test", 0, token);
String deviceKey = dbRefDevices.push().getKey();
dbRefDevices.child(deviceKey).setValue(device)
.addOnFailureListener(new OnFailureListener() {
@Override public void onFailure(@NonNull Exception e) {
Log.e(TAG, "failed. Exception: ", e);
}
});
}
答案 0 :(得分:0)
你应该使用onCreate和onDelete。它们是在SDK的1.0版本中引入的,与您描述的情况完全相同。它将大大简化您的代码。
IMO,onWrite没那么有用。它是1.0天之前的传统触发器。