当孩子从Firebase数据库中删除时如何观察

时间:2019-01-29 06:40:17

标签: objective-c firebase firebase-realtime-database

我正在尝试使用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)数据

如果我可以在删除的观察者中找到删除的密钥,则可以在第二台设备中使用该密钥删除文件夹。

1 个答案:

答案 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 );
 }];