我遇到了一个问题.
在周末,我一直在一个项目,我从一个webservice拉一个大的xml.
它基本上有3层 – 客户,经理,员工都是层次性的.所以应用程序运行的第一次,它拉取这个xml并解析它,并创建3个相关实体 – 客户端,管理员和员工中的所有条目.
每次应用程序启动时,我需要将同一个XML下拉,但是这一次,我只需要“更新”任何已经更改的现有记录,或者为自己以前出现的新客户,管理员或员工添加新的记录时间.
所以 – 在这一刻,正如我所说,它正在拉扯所有,解析它正确,创建正确的实体和填写所有的属性.
然而,没有数据更改,在第二次启动它是DUPLICATING所有的数据 – 所以而不是15个客户端(正确的数字)我有30等等…
我真的需要在我的解析中添加许多代码来检查,而不是创建一个新的NSManagedobject,我检查它是否已经在那里?
如果是 – 我必须手动检查每个属性?
这是非常痛苦和长期的 – 没有办法让Core Data为我自动做这样的事情?
感谢任何帮助或建议.
解决方法
如Apple Docs
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html中所述
你需要循环数据模型并从中处理它
例:
// loop over employeeIDs // anID = ... each employeeID in turn // within body of loop Nsstring *predicateString = [Nsstring stringWithFormat: @"employeeID == %@",anID]; nspredicate *predicate = [nspredicate predicateWithFormat:predicateString];
我个人不喜欢这种方法,我写了这个代码段,在一个高效的庄园处理这个代码,这是直截了当的!我注意到苹果的方法,我遇到了具有不同字符的字符串,如国会大厦字母和空格的问题.下面的代码是测试和工作,如果你正确地重命名所有对应的对象我真的相信这是最有效的方式来完成,不添加重复的核心数据.
-(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;
}
}