我正在使用NSXMLParser和核心数据解析Feed并在我的iPhone应用程序中使用核心数据添加/更新实体。使用NSXMLParser和核心数据更新实体的功能
的问题是,饲料中含有新的和更新数据,所以一旦我解析饲料会发生以下情况:
- 创建一个新的实体
- 使用的NSXMLParser
- 在didEndElement填充实体属性,使用与我们解析的实体相同的myEntityId获取系统中已有的实体。
- 如果有超过1个实体,那么在馈送传递给我们新数据时删除旧的。
- 保存实体
我的问题是,它似乎是一个大量的工作,以节省更新信息,并且代码也总是创建一个新的记录,而不是仅仅更新当前记录。
无论如何,这个过程可以变得更简单,避免需要创建一个新的实体并删除旧的更新?
我的缩写代码如下:
DidStartElement
- (void)parser:(NSXMLParser *)parser didStartElement...
{
if ([elementName isEqualToString:@"AnEntity"])
{
NSManagedObject *newEntity = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:_context];
self.currentEntityObject = newEntity;
} else
{
if ([elementName isEqualToString:@"Title"] || [elementName isEqualToString:@"MyEntityId"])
{
self.currentProperty = [NSMutableString string];
}
}
}
DidEndElement
- (void)parser:(NSXMLParser *)parser didEndElement...
{
if (self.currentEntityObject)
{
if ([elementName isEqualToString:@"Title"])
{
[self.currentEntityObject setValue:self.currentProperty forKey:@"title"];
} else if ([elementName isEqualToString:@"MyEntityId"])
{
[self.currentEntityObject setValue:self.currentProperty forKey:@"myEntityId"];
} else if ([elementName isEqualToString:@"AnEntity"])
{
[self.currentEntityObject setValue:[NSDate date] forKey:@"lastUpdated"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:_context];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(myEntityId = %@)", [self.currentEntityObject valueForKey:@"myEntityId"]];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *array = [_context executeFetchRequest:request error:&error];
int countOfEntityId = array.count;
if (array != nil && countOfEntityId > 1)
{
// This is an update so remove old versions
for(int i=0; i < countOfEntityId; i++)
{
if(self.currentEntityObject != [array objectAtIndex:i])
{
[_context deleteObject:[array objectAtIndex:i]];
}
}
}
error = nil;
[_context save:&error];
self.currentEntityObject = nil;
}
}
}
FoundCharacters
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (self.currentProperty)
{
[currentProperty appendString:string];
}
}
我的问题是,它好像很多Ø f工作来保存更新信息,并且它总是创建新记录而不是仅更新当前记录。
无论如何,这个过程可以变得更简单,避免需要创建一个新的实体并删除旧的更新?
任何建议将是伟大的。
感谢 丰富