2012-05-12 66 views
1

我有一個父<-->>子關係(對多)。 以及關係是,當我需要獲取所有的孩子(一個或多個),Parent.children = (NSSet *) child(s)最簡單的獲取請求獲取'最新'單個實體 - 核心數據

有些時候,我只需要只一個基於實體Child的時間戳屬性最新實體。

我在徘徊什麼將是最簡單的方式來獲取它,比創建一個提取請求和設置提取限制更容易一個,並使用排序描述符基於timeStamp來排序它。

有沒有更簡單的方法?只是呼籲也許:

[Parent.children firstObject]; 

原因是我需要通過應用程序的生活多次獲取它。在某些情況下,我雖然我不得不取得最新的Child實體-(void)awakeFromFetch() of a Parent Entity ..這就是爲什麼我想有一種方式比任何其他內存方面更容易。


時,取子實體,我還挺取其中一束是孩子使用這種斷言2個或多個父實體:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"forParent IN %@", [Array of Parents]]; 

從所得的NSSet,因爲我會得到所有爲所述對象所需的子實體,如果我可以根據其時間戳屬性(NSDate)分配指向最新子的指針將會非常方便。

很顯然,當我得到NSSet結果後,我可以迭代每個孩子,並分配一個指向我在NSSet中找到的最新實體的指針,但它看起來非常辛苦,但我必須分配一個指針一個特定的的最新實體,迭代可能可能具有超過一百個實體的NSSet似乎是bad programming

任何想法?

+2

而是限制1和排序,我已經用了類似的問題NSExpression與'最大:'功能。其他解決方案是在父模型上創建一個latestChild屬性,並在創建每個新子時進行設置。這不是理想的,但工作,它是最快的解決方案。 –

+0

你能否詳細介紹一下位男士?我沒有完全得到'在父實體上創建模型' – user134611

+0

讓我解釋一下:)你有兩個實體 - 父和子。將名爲latestChild的新屬性添加到模型中的Parent實體(由xcode定義的MOM),並將此latestChild設置爲最近添加到Parent.childrens的子級。所以,finallyChild和child是直接關係,而不是通過謂詞或迭代計算關係。 –

回答

1

你有幾個選擇。 fetchLimit = 1的提取請求按時間排序實際上不是一個錯誤的選項。您甚至可以在模型GUI中將時間戳字段設置爲INDEX,並且查找速度會非常快。

如果數據庫將不斷變化,並且您總是希望訪問最近的項目,可以考慮在NSManagedObjectContext上註冊DidSave通知。

當上下文被保存時(或者甚至當有任何對象發生變化時)可以調用。在通知方法中,只需查看插入的項目,然後更新以獲取最新值。

您可以搜索插入的對象,並獲取具有最大時間戳的匹配實體。

用於保存和對象變化的通知是:

NSManagedObjectContextDidSaveNotification NSManagedObjectContextObjectsDidChangeNotification