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

Posted

技术标签:

【中文标题】在 Objective C 中从 XML 中获取核心数据【英文标题】:Grabbing Core Data from XML in Objective C 【发布时间】: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 非常适合这些东西,但您必须了解它与数据库的不同之处。 【参考方案1】:

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

【讨论】:

问题是我在解析器 didStartElement: not at parser didEndElement:(NSString *) 处创建记录 不知道为什么会有所作为。解析器启动一个新的业务元素。创建业务。你看这个城市的名字是雅加达。如果您将雅加达作为一个城市,您可以检查核心数据。如果这样做,则将其设置为商业城市。如果 jakarta 不存在,则创建 Jakarta 城市,然后设置关系。 @Jim Thio -- 如果您在读取元素数据之前创建记录,如何将其与任何其他格式的任何其他数据进行比较?您需要读入元素的数据,然后检查是否已经存在具有这些属性的对象。【参考方案2】:

如果城市记录是单独的实体,而不仅仅是业务实体的属性,您可以完成此任务。我不知道任何内置的 Core Data 功能会为您强制执行唯一性,因此您必须自己构建。实现此任务的最简单方法是在另一个答案中遵循 sosborn 的建议。从您的 XML 中读取城市名称并使用 NSFetchRequest 在您的数据中查找该城市。如果您找到了城市,请将找到的 City 实体插入到您的 Business 实体中。如果您没有找到城市,请创建一个新的 City 实体以插入到您的 Business 实体中。

【讨论】:

以上是关于在 Objective C 中从 XML 中获取核心数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSString 变量在 PhoneGap 中从 Objective C 编写 JavaScript

在 Objective C 中从 NSDictionary 对象创建 URL 查询参数

如何比较在Objective C中从NSArray转换的String?

如何在 iOS 8 Objective c 中的 UIWebView 中从文档中加载 png 图像

在 Objective C 中从 web 目录加载多个图像

尝试在objective-c中从objects[0]插入nil对象