ios - 删除一个 Realm 对象及其所有 RLMArrays

标签 ios objective-c realm

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

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

Current realm structure

如您所见,当前创建了三个 RLMTopoResult 对象,每个对象都有 86 个 RLMCriteria 作为子数组。 (不可见的是,每个 RLMCriteria 都有自己的 RLMStatistics 数组——这就是为什么 RLMStatistics 对象和 RLMCriteria 对象一样多的原因)。

现在,我们的想法是删除一个 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 个!...还有什么问题??...)

enter image description here

最佳答案

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

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

关于ios - 删除一个 Realm 对象及其所有 RLMArrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27104370/

相关文章:

java - 1个项目中的多 Realm 数据库

python - 从脚本中删除线程使用

ios - Dispatch Queue 中的 CIFilters 在启用 ARC 的项目中导致内存问题

java - 如何更改java中Gson创建的json结构

objective-c - 无法在 UINavigationBar 中重命名或设置新的 backBarButtonItem

ios - 由于自动布局和大量 subview ,关闭 VC 非常慢

ios - Realm 和 iOS 保留周期

ios - 性能:点语法VS ivar

iphone - 为什么我的 iPad mini 在更新到 iOS 7 后无法在 Xcode 中检测到?

iphone - 崩溃报告中是否提供 iOS 设备 UDID?