【发布时间】:2012-01-18 22:37:45
【问题描述】:
我正在使用 NSXMLParser 和 Core Data 来解析提要并使用我的 iPhone 应用程序中的核心数据添加/更新实体。
问题是提要包含新的和更新的数据,所以一旦我解析提要,就会发生以下情况:
- 创建一个新实体
- 使用 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];
}
}
}
DidEnd元素
- (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;
}
}
}
找到的字符
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (self.currentProperty)
{
[currentProperty appendString:string];
}
}
我的问题是,保存更新信息似乎需要做很多工作,而且它总是会创建一条新记录,而不仅仅是更新当前记录。
无论如何,这个过程是否可以变得更简单,避免在更新时创建新实体并删除旧实体?
任何建议都会很棒。
谢谢 丰富
【问题讨论】:
标签: objective-c ios xcode core-data nsxmlparser