2011-12-13 37 views
0

我有一個看起來像這樣取指的財產返還不當計數

意達核心數據關係 - >> ItemB

這裏作爲意達有很多itemB的。我想使用一個抓取的屬性,它允許我抓取與itemA關聯的itemB的所有關聯itemB,其中int32狀態屬性設置爲「2」。所以我創建的數據建模已取得的屬性,有以下幾點:

牽強屬性:completedItem 謂:狀態== 2 目的地:itemB

當我第一次嘗試過了,我得到了項背,並我認爲這一切都很酷並且完成了,後來我注意到了奇怪的行爲,當我仔細查看它返回的項目時,沒有任何與itemA對象關聯的itemB的實際數量。即使更奇怪的是,返回類型是NSFaultingMutableArray。這裏有一個簡單的例子

  • 意大利意達集團itemB 0
  • 上的NSSet屬性過濾謂詞搜索意大利意達集團的ItemB返回0
  • 所取得的財產「completedItem」返回ItemB
  • 的4
  • 類型它返回的是NSFaultingMutableArray

這在我的腦海裏現在只是很奇怪,實際上沒有道理。有任何想法嗎?

更新1:

它出現在這裏列出的獲取屬性獲取所有 ItemB對象是核心數據所提供的謂詞相匹配,即使它沒有問題與意達相關

回答

2

這裏的答案,在這個問題上這一切的怪事:取出的性能確實沒有返回ItemB只是對象爲意達

1)。爲了做到這一點,你必須在所獲取的屬性中添加這樣的斷言

status == 2 AND ItemA == $FETCH_SOURCE 

2)從取出的屬性文件:

已取得的財產懶洋洋地評估,並隨後緩存。

如果目標實體中的對象發生更改,則必須重新評估提取的屬性以確保它是最新的。您可以使用refreshObject:mergeChanges:手動刷新屬性 - 這會導致與此屬性關聯的讀取請求在下次觸發對象故障時再次執行。

所以基本上用refreshObject:mergeChanges手動刷新對象來重新載入抓取的屬性。你可以通過添加一個刷新方法或者通過對子類NSManagedObject中的KVC get方法進行重寫來做到這一點。

這就是說,這裏的其他人(Rob Booth,Grady Player)通過完全繞過獲取的屬性還有其他有效的解決方案。雖然這些都是faril

0

讓使用這個術語:

我們有一個對象A的ClassA的

我們ClassB的

的一些對象(未命名)

我們已經將ClassB對象添加到objectA。

對象A是NSManagedObject ... 的子類的引用,當你調用objectA.completeItem,你問對象A的集ItemB的, 這將工作,因爲你有一個實例在內存中的工作。

當您製作新的NSManagedObjectContext並在其中執行提取操作時,除非您在執行提取前對objectA的上下文執行保存,否則它不知道有關objectA或其關係的任何信息。

編輯:

你謂詞過濾出由意達所擁有的ClassB的對象,您可以像使用謂詞(假設意達是你的意達cpmletedItem關係的倒數)

[NSPredicate predicateWithFormat: @"itemA = %@",itemA];

+0

有點困惑,這是什麼意思,雖然 – 2011-12-13 20:58:37

+0

會寫更多。 – 2011-12-13 21:24:31

0

凱爾,問題是核心數據試圖比你更聰明。如果您不打算使用它們,Core Data不想用數據存儲區中的所有對象來填充內存。所以不是一直創建真實對象,而是創建「故障」。故障是真實對象的佔位符,當您要求這些對象時,核心數據將進入並填充對象。

我最好的猜測是你在ItemA.ItemB屬性上的搜索沒有實現鏈接的對象,所以這就是爲什麼你要回0套。如果你只是做了NSSet * mySet = ItemA.ItemB我相信你會看到mySet包含正確的對象數。但是對ItemA.ItemB進行計數的操作是將計數消息發送給Faulted Set,因此返回0.

當您使用completedItems屬性時CoreData似乎至少在做一些事情來返回正確數量的對象,但而不是實際的對象數據。