2010-02-19 43 views
2

我有一個包含商店列表的XML文件,下面是一個簡化版本。我想要幫助的是關於將這些數據移動到對象以存儲在Core Data中的最簡單方法的一些高級概念。我看到圍繞鍵值對的建議,但正如您在下面的示例中所看到的那樣,我擁有具有相同名稱/鍵的子元素,並且每個存儲元素可以有任意數量的這些元素。應該採取哪些步驟將我的XML轉換爲核心數據對象?

我打算將這些對象存儲在應用程序中供將來使用(它們將作爲地圖上的註釋)。所以,每個重複的字段都需要存儲,其中一個不足以滿足需求。我知道如何在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> 

如果鍵值對是要走的路,請點我到哪裏可以佔到重複元素的方法。如果還有另一種方式,我全是耳朵。

謝謝

+0

運行,你可以多說一點關於你打算如何使用這些?例如,你是否需要保留每個重複字段的所有值?你需要搜索它們,還是隻顯示它們?像任何建模問題一樣,上下文對於判斷折衷很重要。 – 2010-02-19 00:59:16

+0

謝謝@Sixten Otto我會更新問題 – conorgriffin 2010-02-19 01:10:32

回答

5

更難的部分是要設計一個合理的數據模型。您可能需要一個商店實體,一個用於電話,可能需要一個用於所有者。商店應該是一對多的電話號碼,並與所有者一對一(只需查看您的數據)。

一旦您已經佈置了數據模型,那麼您可以使用NSXMLParser或像TouchXML這樣的第三方庫來解析XML。從你的元素開始。對於那裏的每個商品,根據商店實體創建一個對象。對於元素中的每個電話,創建一個電話實體等等。

+0

那麼你會說我正在解析的時候創建對象是最簡單的方法嗎?任何性能都會影響這樣做?我想這是我在考慮的一對多關係,在解析時可能會出現一些複雜情況。但是,如果我爲每個電話元素即時創建電話對象,可能會簡化一些事情。但是,由於這些實體中會有超過250個元素的元素比我的例子多,所以我只是在考慮性能。 PS,所有者不會實際存儲。我堅持把它作爲一個示例字段 – conorgriffin 2010-02-19 01:39:16

+0

@Ben Gottlieb - 爲了澄清,我對事物解析方面已經很熟悉,只是下一步就是我希望得到一些幫助的地方。謝謝 – conorgriffin 2010-02-19 01:57:36

+0

解析此文件時可能會遇到性能問題,因此您可能需要在後臺執行此操作。然而,你在設備和核心數據的能力範圍內都很好。 – 2010-02-19 02:23:26

0

我認爲創建即分析方法不僅是最直接,也是最少資源密集型方法。如果您可以使用面向流的解析器來處理XML,並在完成解析時保存商店,那麼您一次只能在內存中保存更少的內容。

我也會認真考慮屬性是否需要成爲完整的實體,或者只是商店的屬性。例如,你是否會在地圖上顯示所有者的名字? (並且,是的,我看到您對此特定事件的評論僅僅是一個示例。)

不幸的是,Core Data並沒有提供一種很好的方法來執行不屬於關係的多值屬性。 (這裏的電話號碼確實看起來像是一串字符串。)雖然參見this SO questionthis cocoa-dev thread對此進行了一些討論。

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> 
相關問題