我正在尝试使用Firebase中的实时数据库在两个设备之间同步数据。当我删除一个孩子的价值。我没有收到用于删除子项的观察者事件(FIRDataEventTypeChildRemoved)。
树结构:
userID
folders
folder_ID1 // to be deleted
folder_name:"Home"
folder_key:"folder_ID1"
folder_ID2
folder_name:"Home"
folder_key:"folder_ID2"
现在,当我从第一台设备中删除文件夹“ folder_ID1”的子项时,我在FIRDataEventTypeChildChanged观察者上获取了事件,但在FIRDataEventTypeChildRemoved中却未获取到该事件。因此,我无法删除第二台设备中的文件夹。
[ fdb_ observeEventType:FIRDataEventTypeChildChanged withBlock:^(FIRDataSnapshot* snapshot)
{
// Called with the key "folders" which has only "folder_ID2" after the remove value is called
}
[ fdb_ observeEventType:FIRDataEventTypeChildRemoved withBlock:^(FIRDataSnapshot* snapshot)
{
// Not called. But if I call removeValue for the child "folders" this observer is called.
}
这是我用来删除所需的孩子ID的方法
[[[[[[ FIRDatabase database ] reference ]
child:currentUser_.uid ]
child:@"folders" ]
child:@"folder_ID1" ] removeValueWithCompletionBlock:^(NSError * _Nullable error, FIRDatabaseReference * _Nonnull ref) {
NSLog( @"Error %@", error );
}];
调用remove函数没有任何错误。但是我没有在第二个设备上收到该事件。因此,我无法删除第二台设备中的文件夹。同样,在删除child_key时,使用snapshot.key“ folders”调用Changed事件。其中仅包含文件夹(folder_ID2)数据
如果我可以在删除的观察者中找到删除的密钥,则可以在第二台设备中使用该密钥删除文件夹。
答案 0 :(得分:0)
我不确定为什么会这样。但是,当我更改引用方式时,它就起作用了。
我为删除观察者设置的参考如下
fdb_ = [ [ [ FIRDatabase database ] reference ] child:currentUser_.uid ];
然后我将其更改为以下代码,它对我有用。现在,它将在删除观察者上调用我删除的键(folder_ID1)。我必须为文件夹设置观察器,而不是更高一级的键。
FIRDatabaseReference* fdb = [[[[ FIRDatabase database ] reference ]
child:currentUser_.uid ]
child:@"folders" ];
[ fdb observeEventType:FIRDataEventTypeChildRemoved
withBlock:^(FIRDataSnapshot * _Nonnull snapshot)
{
NSLog( @"Remove Folder remove observer %@", snapshot.key );
}];