gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:45:42 24 4
gpt4 key购买 nike

我正在努力删除 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com