Objective c 在Objective C中从XML中获取核心数据

Objective c 在Objective C中从XML中获取核心数据,objective-c,xcode,core-data,Objective C,Xcode,Core Data,我从XML中获取核心数据。但是,我想知道,我没有两次插入相同的内容 例如,XML有一个表 <Business> <title>Sushi Tei</title> <City>Jakarta</City> </Business> <Business> <title>Sushi Fun</title> <City>Jakarta</City> </Busines

我从XML中获取核心数据。但是,我想知道,我没有两次插入相同的内容

例如,XML有一个表

<Business>
<title>Sushi Tei</title>
<City>Jakarta</City>
</Business>

<Business>
<title>Sushi Fun</title>
<City>Jakarta</City>
</Business>
in(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName

但这太复杂了。例如,我需要跟踪Business、Cities的所有属性,以及它们的所有子属性“某处”,然后重建整个对象。当然,存储核心数据中所有内容的最佳位置。但我需要在了解元素之前决定是否创建一个新的。我只需要一个好的、经过验证的标准设计模式,用于使用NSXMLParser来核心数据

我应该只使用touchxml吗

另一种解决方案是将城市名称等数据放在XML的属性中,而不是作为子项。对我来说没问题。这是唯一的办法吗?
嗯…

我相信在创建记录之前,您必须手动检查(使用NSFetchRequest)记录是否存在。如果它确实存在,则不创建新记录,但如果它不存在,则创建记录。

如果城市记录是独立的实体,而不仅仅是业务实体的属性,则可以完成此任务。我不知道任何内置的核心数据功能会为您带来独特性,所以您必须自己构建。实现此任务的最简单方法是在另一个答案中遵循sosborn的建议。从XML中读取城市名称,并使用NSFetchRequest在数据中查找该城市。如果找到城市,请将找到的城市实体插入到您的业务实体中。如果找不到城市,请创建一个新的城市实体以插入到您的业务实体中。

问题是我正在parser didStartElement:而不是parser didEndElement:(NSString*)处创建记录,但不确定为什么会有不同。解析器启动一个新的业务元素。创建业务。你看这个城市的名字是雅加达。如果你把雅加达作为一个城市,你就要登记核心数据。如果你这样做了,你就把它设定为商业城市。如果雅加达不存在,则创建雅加达城市,然后设置关系。@Jim Thio——如果在读取元素数据之前创建记录,如何将其与任何其他格式的数据进行比较?您需要读入元素的数据,然后检查是否已经存在具有这些属性的对象。实体不是表。对象不是行。属性不是列。关系不是连接。核心数据是一个对象图管理系统,它可以持久化对象图,也可以不持久化对象图,还可以在后台使用SQL来持久化对象图。试图用SQL术语来理解核心数据会导致您完全误解核心数据,并导致很多悲伤和浪费时间。TechZen正中要害。CoreData非常适合这类东西,但您必须了解它与数据库的区别。
One solution is to do 

if ([elementName isEqualToString:@"Badger"])
{
    self.currentBusiness=[NSEntityDescription insertNewObjectForEntityForName:@"Business" inManagedObjectContext:BNUtilitiesQuick.managedObjectContext];
}
if ([elementName isEqualToString:@"Building"])
{
    self.currentBuilding=[NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:BNUtilitiesQuick.managedObjectContext];
    self.currentBusiness.Building=self.currentBuilding;
}
if ([elementName isEqualToString:@"City"])
{
    self.currentCity=[NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:BNUtilitiesQuick.managedObjectContext];
    self.currentBusiness.City=self.currentCity;
}