【发布时间】:2011-05-09 03:00:09
【问题描述】:
我正在从 XML 中获取核心数据。但是,我想知道我没有两次插入相同的东西。
所以XML有表,例如
<Business>
<title>Sushi Tei</title>
<City>Jakarta</City>
</Business>
<Business>
<title>Sushi Fun</title>
<City>Jakarta</City>
</Business>
现在我不希望核心数据存储 2 个城市。核心数据必须意识到雅加达城市已经存在,而是使用之前的城市记录。
问题是当 NSXMLParser 到达开头时,我们不知道城市名称是否会是 Jakarta。但我们通常使用它来创建新的 CoreDataObjects。
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;
}
在 (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName;
但这太复杂了。例如,我需要跟踪 Business、Cities 的所有属性以及它们的所有子属性“somewhere”,然后在此之后重建整个对象。存储所有内容的最佳位置当然是核心数据。但我需要在了解元素之前决定是否应该创建一个新的。我只需要一个经过验证的良好标准设计模式来使用 NSXMLParser 处理核心数据。
我应该只使用 touchxml 吗?
另一种解决方案是将城市名称等数据放在 XML 的属性中,而不是作为子项。这对我来说很好。这是唯一的方法吗? 嗯……
【问题讨论】:
-
忠告:Core Data 不是 SQL。实体不是表格。对象不是行。属性不是列。关系不是连接。 Core Data 是一个对象图管理系统,它可能会也可能不会持久化对象图,并且可能会或可能不会在幕后使用 SQL 来做到这一点。试图用 SQL 术语来思考 Core Data 会导致您完全误解 Core Data 并导致很多痛苦和浪费时间。
-
TechZen 击中了它的头部。 CoreData 非常适合这些东西,但您必须了解它与数据库的不同之处。
标签: objective-c xcode core-data