2

我有一个包含商店列表的 XML 文件,下面是简化版本。我想要帮助的是关于将这些数据移动到对象中以存储在 Core Data 中的最简单方法的一些高级想法。我看到了有关键值对的建议,但正如您在下面的示例中所见,我有具有相同名称/键的子元素,并且每个商店元素可以有任意数量的这些元素。

我打算将这些对象存储在应用程序中以供将来使用(它们将成为地图上的注释)。因此,每个重复字段都需要存储,其中一个是不够的。我知道如何在 Core Data 中对其进行建模,我相信,我将拥有一个电话号码实体和一个商店实体,并将仅基于<store-id>. 我只是想使用一种简单的方法通过其他一些数据结构将它们从 XML 移动到 Core Data。

XML 示例:

<stores>
  <store>
   <store-id>1</store-id>
   <city>Dublin</city>
   <phone>011234567</phone>
   <phone>011234566</phone>
   <owner>Joe Bloggs</owner>
  </store>
  <store>
   <store-id>2</store-id>
   <city>Cork</city>
   <phone>019876543</phone>
   <phone>019876542</phone>
   <owner>Joe Bloggs</owner>
  </store>
<stores>

如果键值对是要走的路,请指出我可以解释重复元素的方法。如果有另一种方式,我会全神贯注。

谢谢

4

3 回答 3

5

更难的部分将是设计一个有意义的数据模型。您可能需要一个实体用于商店,一个用于电话,一个可能用于所有者。商店应该与电话号码是一对多的,并且与所有者是一对一的(只需查看您的数据)。

布置好数据模型后,您可以使用 NSXMLParser 或 TouchXML 等第三方库来解析 XML。从你的元素开始。对于其中的每个项目,根据商店实体创建一个对象。对于元素中的每个电话,创建一个电话实体,依此类推。

于 2010-02-19T01:32:54.987 回答
0

我敢肯定,“即解析即创建”方法可能不仅是最直接的方法,而且是资源密集度最低的方法。如果您可以使用面向流的解析器来处理 XML,并在完成解析时保存存储,那么您一次必须在内存中保存的东西就会少得多。

我还会认真考虑属性是否需要是成熟的实体,或者只是商店的属性。例如,除了将所有者的姓名显示在地图上之外,您还会对其进行任何操作吗?(而且,是的,我看到你关于那件事的评论只是一个例子。)

不幸的是,Core Data 并没有真正提供一种很好的方法来处理不是关系的多值属性。(这里的电话号码看起来真的像是一个字符串数组。)虽然看到这个 SO question这个 cocoa-dev 线程对此进行了一些讨论。

于 2010-02-19T03:56:14.710 回答
0

只是在基本层面上,不多..我真的不知道你在哪里指定这个,也许当你第一次创建模型时..但是数据存储的选择之一是 .plist,它XML所有密集的目的...

例如......这个“老派”plist,直接从核心数据模型中提取......

(
Editorial,
News,
Retraction,
"FLAME!",
)

是与此 XML 集完全相同的数据,一旦运行

/usr/bin/plutil -convert xml1 /../input.plist -o /../output.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Editorial</string>
    <string>News</string>
    <string>Retraction</string>
    <string>FLAME!</string>
</array>
</plist>
于 2011-08-02T13:08:21.973 回答