如何防止iOS 5中的核心数据重复?

如何防止iOS 5中的核心数据重复?,ios,web-services,core-data,duplicates,Ios,Web Services,Core Data,Duplicates,我遇到了一个问题 周末我一直在做一个项目,从Web服务中提取一个大型xml 它基本上有三个层次-客户,经理,员工-所有层次。因此,应用程序第一次运行时,它会提取这个xml并解析它,然后在3个相关实体中创建所有条目——客户、经理和员工 每次应用程序启动时,我都需要下拉相同的XML,但这一次,我只需要“更新”任何已更改的现有记录,或者为自上次以来出现的新客户、经理或员工添加新记录 现在,正如我所说的,它正在拉取所有数据,正确地解析数据,创建正确的实体,并填充所有属性 但是,在没有数据更改的情况下,在

我遇到了一个问题

周末我一直在做一个项目,从Web服务中提取一个大型xml

它基本上有三个层次-客户,经理,员工-所有层次。因此,应用程序第一次运行时,它会提取这个xml并解析它,然后在3个相关实体中创建所有条目——客户、经理和员工

每次应用程序启动时,我都需要下拉相同的XML,但这一次,我只需要“更新”任何已更改的现有记录,或者为自上次以来出现的新客户、经理或员工添加新记录

现在,正如我所说的,它正在拉取所有数据,正确地解析数据,创建正确的实体,并填充所有属性

但是,在没有数据更改的情况下,在第二次发布时,它复制了所有数据-因此,我没有15个客户端(正确的数目),而是30个,以此类推

我真的需要在解析中添加大量代码来检查它,而不是创建一个新的NSManagedObject,而是检查它是否已经存在

如果是-我必须手动检查每个属性

这是非常痛苦和冗长的——难道没有办法让核心数据自动为我做这类事情吗


谢谢您的帮助或建议。

我担心您必须自己保持数据库干净…最简单的方法是使用
NSFetchRequest
:导入更新的数据时,您可以对现有数据运行查询,并决定要做什么

正如Marcus S.Zarra在关于本主题的文章中提到的:

导入新行时,可以对 查看现有行是否已就位。要做到这一点,您需要创建 针对实体的NSFetchRequest,设置要查找的谓词 guid属性,并将返回的最大行数设置为1

我建议您在访问期间保留此请求 导入,以便在进行导入时可以重用它。如果 NSFetchRequest返回一行,您可以更新该行。如果没有 返回一行,然后可以插入新行

如果操作正确,您会发现性能超过 可以接受

另一个好的信息来源是Apple编程指南:

如Apple文档中所述

您需要循环数据模型并从那里像这样处理它

例如:

// loop over employeeIDs
// anID = ... each employeeID in turn
// within body of loop

NSString *predicateString = [NSString stringWithFormat: @"employeeID == %@", anID];

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
就我个人而言,我不喜欢这种方法,我写了这段代码,在一个有效率的庄园里处理这个问题,这是直截了当的!我注意到使用Apple方法时遇到了字符串具有不同字符的问题,例如capitol字母和空格。下面的代码已经过测试,如果您正确地重命名了所有对应的对象,则可以正常工作。我相信这是实现不在核心数据中添加重复项的最有效方法

-(void)AvoidDuplicatesinDataModel
{
    // Define our table/entity to use
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users"
                                              inManagedObjectContext:managedObjectContext];

    // Setup the fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    // Define how we will sort the records
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"users"
                                                                   ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];

    // Fetch the records and handle an error
    NSError *Fetcherror;
    NSMutableArray *mutableFetchResults = [[managedObjectContext
                                            executeFetchRequest:request error:&Fetcherror] mutableCopy];

    if (!mutableFetchResults) {
        // Handle the error.
        // This is a serious error
    }

    //here usersNameTextField.text can be any (id) string that you are searching for
    if ([[mutableFetchResults valueForKey:@"users"]
         containsObject:usernameTextField.text]) {
        //Alert user or handle your duplicate methods from here
        return;
    }
}

@IosProgramming很有趣,如果我的帖子有帮助,你可以接受:)@Besi:谢谢!我已经修复了url。为什么要对获取结果进行可变复制?