核心数据,我怎样才能有效地find和删除pipe理的对象

我的应用程序发送一个获取请求到一个date(上次更新的date)的服务器来更新其内容(核心数据中的2个实体,没有关系,所有的属性是string)…大多数时候它只接收新的内容,但有时它也会收到需要更新的旧内容,而不是仅仅插入。 1表是非常简单直接我只是从数组中更新项目的id(从服务器的ID不是forms的核心数据),我做了这些项目的提取,然后删除它们。 之后,我插入更新的项目,因为他们是新的。 这是我如何删除它们:

-(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个属性来标识项目,如组合键。 我如何build立“ids”的数组? 一个数组的值为2的数组表示组合键? 和谓词? 我只是想知道是否有可能做到这一点,如果不是,我总是可以获取所有的项目,并一一检查,但为此我需要一个在另一个里面,那就是丑陋。 任何帮助表示赞赏。

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

但是,现在要解决这个问题,你需要在一个键上进行一个类似于你上面的操作,然后循环第二个键。 但是,您不需要在循环内执行循环。 您可以针对返回的数组使用第二个NSPredicate来获取要修改的对象。

因为你只是要磁盘一次而第二个filter正在内存中发生,所以不那么丑陋和相当有效率。

更新

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

开发人员编写一个for循环,然后在for循环中进行string比较的效率明显低于让框架执行相同的选项。 怎么样? 用NSPredicate对arrays:

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

如果你testing了这两个选项,谓词将运行得更快。

那么我所做的就是创build另一个名为“标识符”的属性,它是一个stringWithFormat:@"%@%@",key1,key2 ,它无关coredata中的额外string,因为它假设只有less量的pipe理对象在那个实体