如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?

Posted

技术标签:

【中文标题】如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?【英文标题】:How to remove an object from core data which is not present in another nsarray in iOS? 【发布时间】:2016-07-07 13:36:45 【问题描述】:

我有一个应用程序,我需要从我的核心数据对象中删除不存在于字典数组中的元素。

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

但它不能正常工作。谁能指出我哪里出错了?

【问题讨论】:

【参考方案1】:

一些想法:

    不要使用 NSString 的 stringWithFormat 构建谓词,使用 NSPredicate 的 predicateWithFormatno 是一个数字吗?如果是这样,您不应该在 %@ 周围加上引号。 “NO”是保留字;尝试使用不同的属性名称。

    你的逻辑正确吗?它将删除与数组中第一个对象不匹配的所有项目(因此仅保留匹配第一个对象的项目),然后循环并删除与第二个对象不匹配的所有项目等(这可能会删除剩下的那些通过第一次通过循环)。如果对象与数组中的所有对象不匹配,则应仅删除它们。您可以改为使用 NOT IN 谓词:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (attribute IN %@)", array];
    

    这样你就不需要外循环了。

【讨论】:

以上是关于如何从 iOS 的另一个 nsarray 中不存在的核心数据中删除对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSArray 或 NSDitory 从 iOS 发送到 PHP webservice

iOS 如何使用早期版本的 iOS 中不存在的情节提要元素?

当前上下文中不存在 MVC 样式和脚本

iOS:查找要从服务器中删除的项目的 NSArray

如何将 NSMutableArray 的内容复制到 iPhone 应用程序中的另一个 NStArray?

如何将文件从一个应用程序传输到同一 iOS 设备中的另一个应用程序?