2010-04-26 64 views
3

我有一個使用CoreData的應用程序,我試圖找出通過標記實現標記和過濾的最佳方法。對於我的目的,如果我在原始SQLite中這樣做,我只需要三個表,即tags,item_tags,當然還有我的items表。然後過濾就像加入三個表格那樣簡單,其中只有items與給定標籤相關。非常簡單。在iPhone上使用核心數據實現標記

但是,有沒有辦法在CoreData中做到這一點,並利用NSFetchedResultsControllerNSPredicate似乎沒有給你通過連接進行篩選的能力。無論如何,NSPredicate's並不是完整的SQL,所以我可能會在那裏發現錯誤的樹。我試圖避免使用無CoreData的SQLite重新實現我的應用程序,因爲我享受CoreData在其他領域給我的性能。是的,我確實考慮過(並構建了一個測試實現)潛入CoreData生成的原始SQLite,但這不是未來的證明,我也想避免這種情況。

有其他人試圖解決標籤/在UITableView與CoreData過濾與NSFetchedResultsController

回答

9

首先,你其實並不需要一個Item_Tags實體。核心數據能夠模擬多對多的關係,而不需要中間實體。您可以擁有多對多的關係,這種關係具有相互對等的關係,核心數據將盡其全部魔力使其發生在幕後。

因此,要設置提取請求來執行您所描述的操作,您需要執行類似操作。假設您有一個tag,它代表您要過濾的標籤。寫這樣的斷言:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%@ IN tags", tag]]; 

這會給你僅返回Item s表示在他們的一套tags關係具有tag謂語。很簡單,是吧?

切記:核心數據不是數據庫。這是一個對象圖管理系統。它在幕後使用SQL實際上不應該影響你使用它的方式。

+0

哇,這就是它所需要的,並且它與獲取的結果控制器一起工作嗎?聽起來不錯。我會考慮實現這一點。 是的,我知道Core Data不是數據庫。我一直在充分利用它作爲持久對象圖的目的。但是當涉及到這個問題時,我就缺乏對這些NSPredicates的工作方式的瞭解,這讓我對SQL瞭解的很少。 :) – 2010-04-27 00:33:38