2013-11-27 25 views
1

我有一段時間的問題,我一起砍了一個解決方案,但我正在重溫它,希望找到一個真正的解決方案。不幸的是,這並沒有發生。在覈心數據中,我有很多RSS文章。用戶可以訂閱單個Feed中的單個頻道。問題在於某些Feed提供商在同一Feed的多個頻道中發佈完全相同的文章。所以用戶最終得到同一篇文章的2+版本。我希望保留所有文章,以防用戶退訂包含一個副本但仍保留訂閱另一個頻道的副本,但我只想在可用文章列表中顯示單個文章。CoreData獲取基於不同屬性的對象

爲了識別重複項,我創建了文章文本內容的哈希值,並將其作爲屬性存儲在Core Data(text_hash)中的Article實體上。我原來的想法是,我將能夠製作一個獲取請求,該請求可以基於此屬性上的唯一匹配獲取文章,如SQL查詢。事實證明,情況並非如此(我當時剛剛學習Core Data)。

因此,要破解一個解決方案,我獲取所有文章,我做一個空集,我枚舉獲取結果,檢查散列是否在集合中。如果是,我忽略它,如果不是,我將它添加到集合中,然後將文章ID添加到數組中。當我完成後,我創建一個基於文章ID的謂詞並進行另一次獲取。

這看起來非常浪費和笨拙,不僅我獲取兩次並枚舉結果,因爲最終謂詞基於單獨的文章ID,每次添加新文章時都必須重新運行它。

它現在的作品,但我要工作的這個應用程序的新版本,我想盡一切可能做到這一點。任何幫助表示讚賞,謝謝!

+0

你有你的數據的屬性,它是重複的一樣嗎?假設你有Article.name,對於所有重複項都是一樣的嗎? – Mikael

+0

如果text_hash是相同的,那麼他們被認爲是相同的,所以是的,我有一個屬性Article.text_hash,這就是我用來測試重複的東西 – d370urn3ur

+0

所以如果你有,你可以用這個散列來獲取一個對象。但是你可能想要擺脫其他的東西? – Mikael

回答

3

你可以使用propertiesToGroupBy像這樣:

NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Article"]; 
fr.propertiesToGroupBy = @[@"text_hash"]; 
fr.resultType = NSDictionaryResultType; 
NSArray *articles = [ctx executeFetchRequest:fr error:nil]; 
+0

切換到'NSDictionaryResultType'是這裏的關鍵;它爲'NSFetchRequest'增加了很多靈活性,包括'havingPredicate:'和指定自定義表達式。馬特康諾利有一個計數和分組的例子,你應該看看如果你是新的'NSDictionaryResultType'的力量:http://mattconnolly.wordpress.com/2012/06/21/ios-core-data -group-by-and-count-results/ –

+0

@ JCS007:其實我在問這個問題後四處搜尋,並且遇到了propertiesToGroupBy。但是我必須轉而使用字典而不是條款實體。我有幾個表格視圖和很多使用Article實體的方法,我沒有時間重新編寫所有方法來適應此版本的更改。我希望當我開始的時候我就知道這件事......我想如果這是我必須忍受現在我所擁有的唯一方式。感謝您的迴應,我將在未來記住這一點! – d370urn3ur

+0

@HalMueller:感謝您的鏈接!這將使今晚有一些很好的閱讀... – d370urn3ur