gpt4 book ai didi

ios - 核心数据,我如何有效地查找和删除托管对象

转载 作者:行者123 更新时间:2023-11-28 20:08:49 24 4
gpt4 key购买 nike

我的应用程序向服务器发送一个获取请求,其中包含一个日期(上次更新日期)以更新其内容(核心数据中有 2 个实体,没有关系,所有属性都是字符串)...大多数时候它只接收新内容,但有时它也会收到需要更新而不是仅仅插入的旧内容。 1 表非常简单,我只是获取将在数组中更新的项目的 ID(来自服务器的 ID,而不是核心数据),然后我获取这些项目,然后删除它们。之后,我插入更新的项目,因为它们是新的。这是我删除它们的方式:

-(void)deleteOfEntity:(NSString*)entityName theItemsWithIds:(NSArray*)ids{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext: [self managedObjectContext]];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesPropertyValues:NO];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(id IN %@)", ids]];
NSError *error;
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if(fetchedObjects && [fetchedObjects count]>0){
for (NSManagedObject* toDelete in fetchedObjects) {
[[self managedObjectContext] deleteObject:toDelete];
}
}

因为标识每个项目的属性名称通常是 ID。但是另一个表需要 2 个属性来标识项目,比如复合键。如何建立“ids”数组?一个包含 2 个值的数组表示复合键的数组?和谓词?我只想知道是否可以有效地执行此操作,如果不能,我总是可以获取所有项目并逐一检查,但为此我需要一个 for 另一个 for 那太丑了。感谢您的帮助。

最佳答案

当您设计数据库时,您应该创建一个唯一的键字段,即使它只是两个值的组合。那会让这个问题消失。

但是,要解决现在的问题,您需要像上面那样对一个键进行提取,然后循环访问第二个键。但是,您不需要在循环中执行循环。您可以对返回的数组使用第二个 NSPredicate 来获取要修改的对象。

不那么丑陋而且非常高效,因为你只去磁盘一次,第二个过滤器发生在内存中。

更新

@DuncanGroenwald 是正确的,您仍然必须遍历每个对象,但是有循环,有循环。

开发人员编写一个 for 循环,然后在该 for 循环内进行字符串比较,这比让框架执行相同选项的效率要低得多。如何?使用针对数组的 NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"someValue IN %@", idArray];
NSArray *results = [origArray filteredArrayWithPredicate:predicate];

如果您同时测试这两个选项,谓词的运行速度会明显加快。

关于ios - 核心数据,我如何有效地查找和删除托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050372/

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