2013-09-24 26 views
1

在我的核心數據模型中,我想要搜索與其他實體具有一對一關係並且具有所有10個屬性的實體。如果關鍵字出現在實體的任何地方(即使在子實體中),我也應該能夠打印相同的實體。在整個實體中搜索核心數據

使用枚舉塊,對我來說看起來不是一個好選擇。

如何在不影響性能的情況下進行搜索?

回答

2

嘗試使用NSPredicate:如果你回去與快速計數,並使用rangeOfString這樣你可以寫一個關鍵字和實體的NSFetchRequest

+0

嗯,這是想法,但有超過100記錄每個記錄有10個實體,是大量的數據,因此希望更多的性能導向的方法 – Piyush

+2

不要擔心性能,100個記錄是相當合理的(如果不小)數據量,即使是NSArray也是如此。 CoreData + Sqlite肯定能夠承擔這一數量的數據。您是否嘗試在執行提取時測量性能? – Leonardo

+2

@Piyush NSPredicate/NSFetchRequest的確是API爲這類問題提供的。實現這一點,然後返回並開始一個新的線程,如果性能是不可接受的。 – bneely

1

其實名稱:

NSString * lowerCaseTerm = [term lowercaseString];  
NSString * content = [(NSString*)[theEntity valueForKey:"key"] lowercaseString]; 

BOOL containsWord = [content rangeOfString:lowerCaseTerm].location == NSNotFound ? false : true; 

在哪裏「的內容「是您在實體中尋找的」NSString「,您將獲得比NSPredicate更好的性能。謂詞更優雅(代碼少得多),但比rangeOfString慢得多(需要一些設置)

如果你想查看一個實體的多個鍵,然後設置一個快速數組並循環。 @ [@ 「KEY1」,@ 「KEY2」];

我用這種方法不僅查找一個實體是否包含一個單詞,但也確定了相關性。 使用NSPredicate,需要7秒鐘的時間來搜索2000多個實體,並過濾掉那些不需要的然後再度假。

凡rangeOfString一切都花了大約0.25秒。輔助線程0.5秒。 (儀器爲我的具體情況報告我需要提供一個加權的相關性,爲客戶滿意度訂購的。)

(提示:在內容找詞就是掛斷了)

當然,你會想在執行此操作時使用輔助線程來防止您的UI被鎖定。如果需要更清晰的話請告訴我。