【问题标题】:Delete one realm-object and all its RLMArrays删除一个领域对象及其所有 RLMArrays
【发布时间】:2014-11-24 11:59:51
【问题描述】:

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

下图是当前的realm-structure(Realm-Browser截图):

如您所见,目前创建了三个 RLMTopoResult 对象,每个对象都有 86 个 RLMCriteria 作为子数组。 (不可见的是,这些 RLMCriteria 中的每一个都有自己的 RLMStatistics-Array - 这就是为什么 RLMStatistics-objects 与 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(见下面的结果图片)--> 但是,不幸的是,它不会删除它的 Array-Children(和子子项)!!!删除 RLMTopoResult-Nr2 后,仍有 3x86=258 个 RLMCriteria(还有 258 个 RLMStatistics)。但预期为 2x86=172 !!!!

如何自动删除附加到相应 RLMTopoResult 的 86 个 RLMCriteria(及其 86 个 RLMStatistics)子项???

任何帮助表示赞赏!

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

【问题讨论】:

    标签: ios objective-c realm


    【解决方案1】:

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

    - (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];
    }
    

    【讨论】:

    • 谢谢 jpsim !现在这是有道理的。到目前为止,我还通过向 CriteriaRLM 使用“TopoNr”属性并使用预测器搜索这些属性来解决它。但是您的解决方案更优雅。非常感谢!
    • 另外一个相关的问题:如果“CriteriaRLM”也有一个 RLMArray(我们称之为“StatisticsRLM”)怎么办。它的工作方式似乎不同,即 for(RLMTopoResult *topo2 in topos) {[realm deleteObjects:topo2.CriteriaRLM.StatisticsRLM];} 不起作用。有什么建议么 ??同样,我还能够向 StatisticsRLM 添加一个额外的属性“TopoNr”,并且最终还可以使用预测器来删除那些......
    • 请记住,topo2.CriteriaRLM 是一个 RLMArray,因此您必须遍历它们才能调用 deleteObjects:criteria.StatisticsRLM
    • @jpsim 级联删除功能还在进行中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多