我有一个应用程序,我需要从核心数据对象中删除元素中不存在的元素。
-(void)removeoldvalueswhichisnotpresentinnewone:(NSArray *)array{
for(int j=0;j < [array count]; j++){
NSString *pred = [NSString stringWithFormat:@"no !=\"%@\"",[array objectAtIndex:j]];
NSArray *allRes = [self getObjectsOfType:@"Cr" withPredicate:pred];
NSLog(@"%@",allRes);
if ([allRes count] > 0) {
@try {
for(int i=0;i < [allRes count]; i++){
[[self managedObjectContext] deleteObject:(Cr *)[allRes objectAtIndex:i]];
}
[self save];
}
@catch (NSException *exception){
// NSLog(@"Del Warning: Caught %@: %@", [exception name], [exception reason]);
}
}
}
}
但它没有正常工作。任何人都可以指出我哪里出错了?
答案 0 :(得分:1)
一些想法:
stringWithFormat
构建谓词,请使用NSPredicate的predicateWithFormat
。 no
是一个数字吗?如果是这样,你不应该在%@周围加上引号。 你的逻辑是否正确?它将删除与数组中第一个对象不匹配的所有项(因此只保留与第一个对象匹配的那些项),然后循环并删除与第二个对象不匹配的所有项等,这可能会删除那些通过第一次通过循环)。如果对象与 all 数组中的对象不匹配,则只应删除对象。您可以改为使用NOT IN谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (attribute IN %@)", array];
您将不需要外循环。