我正在使用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工作來保存更新信息,並且它總是創建新記錄而不是僅更新當前記錄。
無論如何,這個過程可以變得更簡單,避免需要創建一個新的實體並刪除舊的更新?
任何建議將是偉大的。
感謝 豐富