删除一个领域对象及其所有RLMArray

时间:2014-11-24 11:59:52

标签: ios objective-c realm

我正在努力删除领域对象及其RLMArray子级(和子子级)对象!

下图显示了当前的域结构(Realm-Browser的屏幕截图):

Current realm structure

如您所见,目前创建了三个RLMTopoResult对象,每个对象都有86个RLMCriteria作为children-Array。 (不可见的是,每个RLMCriteria都有自己的RLMStatistics-Array - 这就是RLMCtatistics-对象与RLMCriteria-objects一样多的原因。)

现在,想法是删除一个RLMTopoResult(带有根据TopoNrRLM过滤的预测器)!

我应用以下代码:

- (void) removeObjects_at_TopoNr_from_LocationRLM :(NSUInteger)TopoNr :(NSString *)folderName :(NSString *)fileName {

    RLMRealm *realm = [RLMRealm realmWithPath:[self get_TopoResultRLM_FilePath :folderName :fileName]];
    RLMResults *resultTopoResult = [RLMTopoResult allObjectsInRealm:realm];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TopoNrRLM == %d", TopoNr];
    RLMResults *resultsTopoNr = [resultTopoResult objectsWithPredicate:predicate];

    if ([resultsTopoNr count] > 0) {
        if (TopoNr <= (int)[resultsTopoNr count]) {
            [realm beginWriteTransaction];
            [realm deleteObject:[resultsTopoNr firstObject]];
            [realm commitWriteTransaction];
        }
        else {
            NSLog(@"Fail...trying to remove TopoResult-object with TopoNr bigger to object-count");
        }
    }
    else {
        NSLog(@"Fail...trying to remove TopoResult-object in empty Realm");
    }
}

使用TopoNr = 2运行上述方法删除(如预期)RLMTopoResult Nr2(参见下面的结果图) - &gt;但是,不幸的是,它并没有删除它的Array-Children(和子孙)!在删除RLMTopoResult-Nr2后,仍然存在3x86 = 258 RLMCriteria(以及258 RLMStatistics)。但预计会是2x86 = 172 !!!!

我该怎样做才能自动删除附加到相应RLMTopoResult的86个RLMCriteria(及其86个RLMStatistics)子项?

任何帮助表示赞赏!

下图显示删除TopoResult Nr2后的结果(带上面的代码): (预计会有172个RLMCriteria而不是258个!......还有什么问题?......)

enter image description here

1 个答案:

答案 0 :(得分:8)

级联删除规则将在未来的版本中出现,但与此同时,您可以相当轻松地完成此操作。这是删除地形儿童的方法的更新版本:

- (void) removeObjects_at_TopoNr_from_LocationRLM :(NSUInteger)TopoNr :(NSString *)folderName :(NSString *)fileName {
    RLMRealm *realm = [RLMRealm realmWithPath:[self get_TopoResultRLM_FilePath :folderName :fileName]];
    [realm beginWriteTransaction];
    RLMResults *topos = [RLMTopoResult objectsInRealm:realm where:@"TopoNrRLM == %d", TopoNr];
    for (RLMTopoResult *topo in topos) {
        [realm deleteObjects:topo.CriteriaRLM];
    }
    [realm deleteObjects:topos];
    [realm commitWriteTransaction];
}