如何防止iOS 5中的核心数据重复?
我遇到了一个问题 周末我一直在做一个项目,从Web服务中提取一个大型xml 它基本上有三个层次-客户,经理,员工-所有层次。因此,应用程序第一次运行时,它会提取这个xml并解析它,然后在3个相关实体中创建所有条目——客户、经理和员工 每次应用程序启动时,我都需要下拉相同的XML,但这一次,我只需要“更新”任何已更改的现有记录,或者为自上次以来出现的新客户、经理或员工添加新记录 现在,正如我所说的,它正在拉取所有数据,正确地解析数据,创建正确的实体,并填充所有属性 但是,在没有数据更改的情况下,在第二次发布时,它复制了所有数据-因此,我没有15个客户端(正确的数目),而是30个,以此类推 我真的需要在解析中添加大量代码来检查它,而不是创建一个新的NSManagedObject,而是检查它是否已经存在 如果是-我必须手动检查每个属性 这是非常痛苦和冗长的——难道没有办法让核心数据自动为我做这类事情吗如何防止iOS 5中的核心数据重复?,ios,web-services,core-data,duplicates,Ios,Web Services,Core Data,Duplicates,我遇到了一个问题 周末我一直在做一个项目,从Web服务中提取一个大型xml 它基本上有三个层次-客户,经理,员工-所有层次。因此,应用程序第一次运行时,它会提取这个xml并解析它,然后在3个相关实体中创建所有条目——客户、经理和员工 每次应用程序启动时,我都需要下拉相同的XML,但这一次,我只需要“更新”任何已更改的现有记录,或者为自上次以来出现的新客户、经理或员工添加新记录 现在,正如我所说的,它正在拉取所有数据,正确地解析数据,创建正确的实体,并填充所有属性 但是,在没有数据更改的情况下,在
谢谢您的帮助或建议。我担心您必须自己保持数据库干净…最简单的方法是使用
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。为什么要对获取结果进行可变复制?