2010-02-12 11 views
1

我需要一些建議如何去做這件事:策略問題:從XML檢索數據以更新本地Core Data DB?

1)我從Web服務器檢索XML。

2)我想使用核心數據在設備上本地存儲來自該XML的所有實體(即朋友)。

3)所以我解析XML,併爲每一位朋友的託管對象在XML

4),但我想確保我沒有一個朋友多次添加到數據庫。我怎麼能做到這一點?

--------------這個----------------

A)我的策略思想在解析XML,只要有Friend元素啓動,我就創建了Friend實體的Managed Object。在那時,我不知道它會是哪個朋友,直到NSXMLParser遍歷所有即將到來的屬性,如firstName,id等;在Friend元素的End-tag之後,我在我的Managed Object Context中有該朋友。然後我創建一個NSFetchRequest來查看該朋友是否已經存儲。問題是,新朋友已經是上下文的一部分,因此核心數據可能會一直返回匹配! B)我需要兩個不同的託管對象上下文,以便解析的朋友首先進入MOC_A,然後查詢MOC_B(實際的本地存儲),而沒有解析出的新朋友干擾我查詢本地存儲。所以我可以找出朋友是否已經存在。

C)從XML解析朋友時,我只是創建一個新的託管對象實例,而不將其添加到託管對象上下文(可能?!)。後來,當朋友完全成功時,如果核心數據被存儲,我將覈對它。如果沒有,我補充一下。否則,我把物體扔掉。

D)我需要另一種策略。

+0

您已經以不同方式多次提出這個問題。答案是在Core Data實體中使用新的索引屬性來存儲XML中的唯一ID。在添加對象之前,您必須手動檢查具有該ID的對象是否已經存在。 – gerry3 2010-02-12 10:12:15

+1

也許我以不同的方式提出這個問題,因爲到目前爲止我還沒有得到任何有用的答案。這個也沒用。我不知道你想說什麼。請更詳細一點。就像我問的那樣(並且最近得到了答案),問題是我的新分析對象存在於上下文中,因此查詢核心數據可能會導致匹配。在投票前請完整閱讀我的問題。 – dontWatchMyProfile 2010-02-12 10:14:10

+0

既然已經添加了新的信息,那就更有意義了。但是,您也可以將此信息添加到其他任何問題中。 – gerry3 2010-02-12 10:19:22

回答

3

您應該在Core Data實體中使用新的索引屬性來存儲XML中的唯一ID。在添加對象之前,您必須手動檢查具有該ID的對象是否已經存在。

UPDATE
最關鍵的是,直到你確定它是新的不被管理對象添加到上下文。
鑑於獨特的ID,這非常簡單,但聽起來你不能先解析唯一ID。在這種情況下,應該使用臨時可變字典(NSMutableDictionary)來存儲解析後的數據。
如果您確定該朋友是新朋友,則可以創建該朋友並從字典中複製數據。如果朋友不是新的,你可以丟棄字典。

+0

嗯,你還沒有真正回答過:問題是一旦NSXMLParser匹配新對象的開始就會創建託管對象,因此MO會直接進入托管對象上下文。然後,問題仍然是開放的:如果它已經存在於上下文中,我該如何:a)安全地查詢核心數據是否存在(它在上下文中是這樣做的!所以我總是得到一個匹配,不是嗎? ),b)如果其中一個類型已經存儲<已存在,則安全地丟棄該對象。 – dontWatchMyProfile 2010-02-12 10:21:27

+0

鑑於新的信息,我已經更新了我的答案。理想情況下,您將能夠首先解析唯一ID並立即執行檢查。如果這是不可能的,我建議使用臨時字典。如果您對此方法有任何疑問,請告知我們。 – gerry3 2010-02-12 10:24:30

+0

感謝您的更新,隊友。現在有道理:)。好吧,讓我們說一旦解析器進入它就不能將它添加到MOC中。我不能只是實例化該託管對象的自定義類,讓我們說'朋友',並根據需要填充屬性?我看到的一個問題是屬性是「動態的」,我相信核心數據會創建這些屬性。但是在這種情況下,核心數據首先不會做任何事情,所以我不能將該類用於臨時對象,除非我深刻修改 - >我可以在不中斷核心數據的情況下修改它嗎?我可以添加實例變量嗎? – dontWatchMyProfile 2010-02-12 10:26:48